it-swarm.asia

Facebook neden PHP'nin yanında C ++ kullandı?

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?

15
Goma

İşte nedeni: PHP için HipHop: Hızlı Hareket Et :

Facebook'taki anahtar değerlerden biri hızlı hareket etmektir. Son altı yıldır, PHP'nin sunduğu hızlı gelişme 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 Facebook'ta diğer dillere göre çok daha hızlı bir şekilde yükselmesini 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 faydalanabileceğini düşünüyoruz, bu yüzden PHP ile büyük karmaşık web sitelerini ölçeklemeye yeni bir odak getirmesini umuyoruz. 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 derleyicinin kendisi değildir. Aksine 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 semantik 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, bir kod transformatörü, PHP'nin çalışma zamanı sisteminin yeniden uygulanması ve bu performans optimizasyonlarından yararlanmak için birçok yaygın PHP Uzantıların yeniden yazılmasını içerir.

Komut Dosyası Dili olarak PHP Ölçeklendirme

PHP'nin kökleri Perl, Python ve Ruby gibi bir komut dosyası dilidir ve bunların tümü programcı üretkenliğ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. Diğer taraftan, komut dosyası dillerinin CPU ve bellek kullanımı söz konusu olduğunda 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 kısımlarını doğrudan C++ içinde PHP Uzantılar olarak yeniden yazmaktır. Bu, büyük ölçüde PHP'yi ö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ı büyük ölçüde azaltır. C++ öğrenmek PHP Uzantıları yazmak için sadece 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 (Çoklu Besleme 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, son sayfa Meclisi'ni yapan mantığı PHP içine yazmamıza ve C++, Erlang, Java veya Python içindeki özel arka uç hizmetlerine güvenerek hızlı bir şekilde yinelememize izin verir Haber Beslemesi, arama, Sohbet ve sitenin diğer temel bölümleri.

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ı PHP projesine tekrar 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 hem CPU hem de bellek kullanımı söz konusu olduğunda C++ PHP'den daha iyi performans gösterir. PHP bile kendisi C'de yazılmıştır. Bu boyuttaki tüm kod tabanını elle yeniden yazmanın imkansız olduğunu biliyorduk, ancak programlı olarak yapmak için bir sistem oluşturursak ne olacağını merak ettik.

PHP performansını iyileştirmenin yeni yollarını bulmak yeni bir kavram değildir. Çalışma zamanında Zend Engine, PHP kaynağınızı daha sonra Zend Sanal Makinesi üzerinden ç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ğunluğu tarafından kullanılır. Ayrıca, opcode optimizasyonu ve önbelleğe alma yoluyla PHP 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ürüp daha sonra yerel makine koduna dönüştürmeyi düşünüyorduk. PHP derlemek bile yeni bir fikir değil, Roadsend ve phc gibi açık kaynaklı projeler PHP 'yi C, Quercus PHP' yi Java 'ya ve Phalanger derliyor PHP ile .Net arasında.

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ı arttırmak için takıma Iain Proctor ve Minghui Yang'ı hızla ekledik. Önümüzdeki on ayı tüm kodlamayı ve sonraki altı ayı da üretim sunucuları üzerinde test ederek bitirdik. 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 komut dosyası dilidir. C++ statik yazarak derlenmiş bir dildir. PHP büyülü dinamik özellikler yazmanıza izin verirken, çoğu PHP nispeten basittir. if (...) {...} else {..} görmeniz, function foo($x) { include $x; } görmekten daha olasıdır. İşte performans kazandığımız yer burası. Mümkün olduğunda, oluşturulan kodumuz işlevler 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:

  1. Kimin neyi ve bağımlılıklarını beyan ettiği hakkında bilgi topladığımız statik analiz,
  2. C++ skalar, String, Array, sınıflar, Object ve Variant arasında en spesifik türü seçtiğimiz çıkarım yazın ve
  3. Çoğunlukla PHP ifadelerinden C++ ifadelerine 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, çalıştırmadan önce PHP kaynak kodunuzu 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 faydalanı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.

20
Trinidad

Kısa cevap - hayır, C++ 'a ihtiyacınız yoktur.

HipHop 'dan bahsettiğinize inanıyorum. Sağladığı iyileştirmeleri okursanız, bu yaklaşık% 50'dir. Binlerce ön uç sunucusuna sahip olan Facebook iseniz bu çok önemlidir. Onları 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 çok daha yüksek tasarruf başardı olabilir = PHP tamamen. Ama bu Facebook gibi büyük 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 blog , ö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 daha iyi bir seçim olacaktır.

13
vartec

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.

6
Scant Roger

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ı).

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ükleriniz neredeyse kesinlikle bir PHP programı - HHVM çalışma zamanı tarafından derlenen ve yorumlanan) çıktı .

Gerçek HHVM serbestçe kullanılabilir açık kaynak. Saatte bir milyon sevimli yavru kedi resmine hizmet etmeniz gerekiyorsa, HHVM'yi indirebilir ve sunucunuzu PHP'nizde minimum değişiklikle hızlandırabilirsiniz.

0
James Anderson