Facebook'un PHP'nin yanında C ++ kullanmasını gerektiren ana neden nedir? Ben meraklıları ile bir web sitesi yapmak merak ediyorum ben de C ++ kullanmanız gerekir?
Facebook'un PHP'nin yanında C ++ kullanmasını gerektiren ana neden nedir? Ben meraklıları ile bir web sitesi yapmak merak ediyorum ben de C ++ kullanmanız gerekir?
Yanıtlar:
Bunun nedeni: HipHop PHP: Hızlı Taşı :
Facebook'taki anahtar değerlerden biri hızlı hareket etmektir. Son altı yıldır, PHP'nin sunduğu hızlı geliştirme hızı sayesinde çok şey başardık. Bir programlama dili olarak PHP basittir. Öğrenmesi kolay, yazması kolay, okunması kolay ve hata ayıklaması basit. Yeni mühendislerin PHP ile diğer dillerde olduğundan çok daha hızlı bir şekilde Facebook'ta daha hızlı gelişmesini sağlayabiliyoruz, bu da daha hızlı yenilik yapmamızı sağlıyor.
Bugün projeyi inanılmaz insanlardan oluşan küçük bir ekiple paylaşmaktan heyecan duyuyorum ve son iki yıldır üzerinde çalışıyorum; PHP için HipHop. HipHop ile Web sunucularımızdaki CPU kullanımını sayfaya bağlı olarak ortalama yüzde elli azalttık. Daha az CPU, daha az sunucu anlamına gelir, bu da daha az ek yük anlamına gelir. Bu projenin Facebook üzerinde muazzam bir etkisi oldu. Web'in genel olarak HipHop'tan yararlanabileceğini düşünüyoruz, bu yüzden PHP ile büyük karmaşık web sitelerini ölçeklemeye yeni bir odak getirmesini umarak bu akşam açık kaynak olarak yayınlıyoruz. HipHop bize inanılmaz sonuçlar gösterse de, kesinlikle tamamlanmadı ve denemeden önce beta yazılımıyla rahat olmalısınız.
PHP için HipHop teknik olarak bir derleyici değildir. Daha ziyade bir kaynak kodu transformatörüdür. HipHop, programlı olarak PHP kaynak kodunuzu yüksek düzeyde optimize edilmiş C ++ 'a dönüştürür ve daha sonra derlemek için g ++ kullanır. HipHop, kaynak kodunu anlamsal olarak eşdeğer bir şekilde yürütür ve daha iyi performans karşılığında eval () gibi nadiren kullanılan bazı özellikleri feda eder. HipHop, bu performans optimizasyonlarından yararlanmak için bir kod transformatörü, PHP'nin çalışma zamanı sisteminin yeniden uygulanması ve birçok yaygın PHP Uzantısının yeniden yazılmasını içerir.
PHP'yi Komut Dosyası Dili Olarak Ölçeklendirme
PHP'nin kökleri Perl, Python ve Ruby gibi bir komut dosyası dilidir ve bunların tümü programcı verimliliği ve ürünler üzerinde hızlı bir şekilde yineleme yeteneği açısından büyük avantajlara sahiptir. Bu, C ++ gibi daha geleneksel derlenmiş dillerle ve Java gibi yorumlanmış dillerle karşılaştırılır. Öte yandan, CPU ve bellek kullanımı söz konusu olduğunda komut dosyası dillerinin genellikle daha az verimli olduğu bilinmektedir. Bu nedenle, Facebook'u her ay 400 milyardan fazla PHP tabanlı sayfa görüntülemeye ölçeklemek zor oldu.
Bu verimsizlikleri ele almanın yaygın bir yolu, PHP uygulamanızın daha karmaşık bölümlerini doğrudan C ++ içinde PHP Uzantıları olarak yeniden yazmaktır. Bu, PHP'yi büyük ölçüde ön uç HTML'niz ve C ++ 'da uygulama mantığı arasında bir tutkal diline dönüştürür. Teknik açıdan bakıldığında, bu iyi çalışır, ancak tüm uygulamanızda çalışabilecek mühendis sayısını önemli ölçüde azaltır. C ++ öğrenmek sadece PHP Uzantıları yazmanın ilk adımı, ikincisi Zend API'lerini anlamaktır. Mühendislik ekibimizin nispeten küçük olduğu göz önüne alındığında - her mühendis için bir milyondan fazla kullanıcı var - kod tabanımızın parçalarını diğerlerinden daha az erişilebilir hale getirmeyi göze alamayız.
Facebook'un ölçeklendirilmesi özellikle zordur, çünkü neredeyse her sayfa görünümü özelleştirilmiş bir deneyime sahip giriş yapmış bir kullanıcıdır. Ana sayfanızı görüntülediğinizde, tüm arkadaşlarınızı aramamız, en alakalı güncellemelerini sorgulamamız (Multifeed olarak adlandırdığımız özel bir hizmetten) sorgulamamız, sonuçları gizlilik ayarlarınıza göre filtrelememiz ve öyküleri yorumlarla doldurmamız gerekir. , fotoğraflar, beğeniler ve insanların Facebook hakkında sevdikleri tüm zengin veriler. Bütün bunlar bir saniyenin biraz altında. HipHop, PHP'de son sayfa derlemesini yapan mantığı yazmamıza ve C ++, Erlang, Java veya Python'daki özel arka uç hizmetlerine güvenerek hızlı bir şekilde yinelememizi sağlar. Sitenin.
2007'den beri bu sorunları çözmenin birkaç farklı yolunu düşündük ve hatta birkaçını uygulamaya çalıştık. Ortak öneri, Facebook'u başka bir dilde yeniden yazmaktır, ancak sitenin karmaşıklığı ve geliştirme hızı göz önüne alındığında, bunun gerçekleştirilmesi biraz zaman alacaktır. Zend Engine'in (PHP'nin dahili) yönlerini yeniden yazdık ve bu yamaları tekrar PHP projesine katkıda bulunduk, ancak sonuçta gereken performans artışlarını görmedik. HipHop'un faydaları geliştirme hızımıza neredeyse şeffaf.
HipHop Hacking
Birkaç yıl önce bir Hackathon'da bir gece (bkz. Prime Time Hack), PHP'yi C ++ 'a dönüştüren ilk kod parçama başladım. Diller sözdizimsel olarak oldukça benzerdir ve C ++ hem CPU hem de bellek kullanımı söz konusu olduğunda PHP'den daha iyi performans gösterir. PHP bile C dilinde yazılmıştır. Bu büyüklükte bir kod tabanının tamamını elle yeniden yazmanın imkansız olduğunu biliyorduk, ancak bunu programlı olarak yapmak için bir sistem inşa edersek ne olacağını merak ettik.
PHP performansını artırmanın yeni yollarını bulmak yeni bir kavram değildir. Çalışma zamanında Zend Engine, PHP kaynağınızı Zend Sanal Makinesi aracılığıyla çalıştırılan opcode dönüştürür. APC ve eAccelerator gibi açık kaynaklı projeler bu çıktıyı önbelleğe alır ve PHP destekli web sitelerinin çoğu tarafından kullanılır. Ayrıca, opcode optimizasyonu ve önbelleğe alma yoluyla PHP'yi daha hızlı hale getiren ticari bir ürün olan Zend Server da var. Bunun yerine, PHP kaynağını doğrudan C ++ 'ya dönüştürerek daha sonra yerel makine koduna dönüştürülmeyi düşünüyorduk. PHP'yi derlemek bile yeni bir fikir değil, Roadsend ve phc gibi açık kaynaklı projeler PHP'yi C'ye, Quercus PHP'yi Java'ya ve Phalanger PHP'yi .Net'e derliyor.
Söylemeye gerek yok, o tek Hackathon'dan daha uzun sürdü. Sekiz ay sonra, derlenmiş kodla daha hızlı çalışmanın gerçekten mümkün olduğunu göstermek için yeterli kodum vardı. Projenin hızını artırmak için Iain Proctor ve Minghui Yang'ı ekibe hızla ekledik. Önümüzdeki on ayı tüm kodlamayı bitirdikten sonra altı ayını üretim sunucuları üzerinde test ettik. Bu noktada, dağıtımdan sadece altı ay sonra, HipHop kullanarak Web trafiğimizin% 90'ından fazlasına hizmet ettiğimizi belirtmekten gurur duyuyoruz.
HipHop Nasıl Çalışır
Projenin ana zorluğu PHP ve C ++ arasındaki boşluğu doldurmaktı. PHP, dinamik ve zayıf yazım içeren bir betik dilidir. C ++ statik yazarak derlenmiş bir dildir. PHP büyülü dinamik özellikler yazmanıza izin verirken, çoğu PHP nispeten basittir. Bu göreceğin olasılığı daha yüksektir
if (...) {...} else {..}
görmek o kadar dahafunction foo($x) { include $x; }
. İşte performans kazandığımız yer burası. Mümkün olduğunda oluşturulan kodumuz fonksiyonlar ve değişkenler için statik bağlama kullanır. Ayrıca değişkenlerimiz için mümkün olan en spesifik türü seçmek ve böylece bellek tasarrufu yapmak için tür çıkarımı kullanırız.Dönüşüm süreci üç ana adımdan oluşur:
- Kimin neyi ve bağımlılıklarını beyan ettiği hakkında bilgi topladığımız statik analiz,
- C ++ skalar, String, Array, sınıflar, Object ve Variant arasında en spesifik türü seçtiğimiz çıkarım yazın ve
- Çoğunlukla PHP deyimleri ve ifadelerinden C ++ deyimleri ve ifadelerine doğrudan yazışma olan kod üretimi.
Ayrıca, geliştirme için tasarlanmış deneysel bir tercüman olan HPHPi'yi de geliştirdik. HPHPi kullanırken PHP kaynak kodunuzu çalıştırmadan önce derlemenize gerek yoktur. HipHop'taki hataları yakalamamıza yardımcı oldu ve mühendislere PHP yazma biçimlerini değiştirmeden HipHop'u kullanmanın bir yolunu sunuyor.
Genel olarak HipHop, C ++ 'ın performans avantajlarından yararlanırken PHP'nin en iyi yönlerini korumamıza izin verir. Toplamda, 300.000 satır kod ve 5.000'den fazla birim test yazdık.
Kısa cevap - hayır, C ++ 'a ihtiyacınız yok .
HipHop'tan bahsettiğinize inanıyorum . Sağladığı iyileştirmeleri okursanız, bu yaklaşık% 50'dir. Binlerce ön uç sunucusu olan Facebook iseniz bu çok önemlidir. Bunları azaltmak, veri merkezi maliyetlerinde milyonlarca tasarruf anlamına gelir. 10-100 ön uç sunucuya sahip bir şirket olması durumunda, geliştirme maliyeti olası tasarrufların çok üzerinde olacaktır. Her neyse, en ağır işleme, son derece optimize C / C ++ kodu olarak geliştirilen, genellikle bazı RDBMS veya NoSQL çözümü olan arka uçta yapılır.
Tabii ki sadece PHP tamamen boşaltma çok daha yüksek tasarruf başardı. Ancak bu, Facebook'ta olduğu gibi devasa kod tabanı ile yapabileceğiniz bir şey değil.
Şimdi, sorunun diğer kısmı için: Eğer gerçekten büyük yüklerle nasıl başa çıkacağınızı bilmek istiyorsanız, Yüksek Ölçeklenebilirlik blogunu , özellikle Gerçek Hayat Mimarileri bölümünü okuyun.
PHP ile mümkündür, ama kesinlikle benim seçimim olmazdı. Dinamik bir dil istiyorsanız, Python, Ruby veya belki Lua çok daha iyi bir seçim olacaktır.
FB'nin yaklaşımıyla ilgili güzel olan şey, hemen karar vermek zorunda olmamalarıdır. Aynısını yapmalısın. Sizi en verimli yapan dili seçin, ancak C / C ++ ile kolayca arayüz oluşturduğundan emin olun.
Milyonlarca kullanıcınız olduğunda ve yanıt sürelerinde milisaniye tıraş etmeniz gerektiğinde, C / C ++ kullanarak kritik yolları optimize edebilirsiniz.
Facebook tarafından kullanılan C ++ öğesi HHVM'dir.
Bu HIPHOP sanal makinesidir. C ++ ile yazılmış olmasına rağmen aslında bir "daha iyi PHP yorumlayıcısı" dır.
Php kodu, daha sonra yürütme zamanında HHVM tarafından yorumlanır ve çalışırken "Tam Zamanında" optimizasyonlarına tabi bayt koduna derlenir.
Yüz kitabındaki geliştiriciler hala çoğunlukla PHP'de yazıyor ve tarayıcınızda gördüğünüz şey kesinlikle bir PHP programı tarafından çıktılanıyor - hepsi de HHVM çalışma zamanı tarafından derlenmiş ve yorumlanmıştır.
Gerçek HHVM serbestçe kullanılabilir açık kaynak. Saatte bir milyon sevimli yavru kedi resmine hizmet etmeniz gerekiyorsa, HHVM'yi indirebilir ve PHP'nizde minimum değişiklikle sunucunuzu hızlandırabilirsiniz.