Qual è il motivo principale che ha reso Facebook necessario utilizzare C ++ accanto a PHP? Mi chiedo se per creare un sito Web con molti visitatori dovrei usare anche C ++?
Qual è il motivo principale che ha reso Facebook necessario utilizzare C ++ accanto a PHP? Mi chiedo se per creare un sito Web con molti visitatori dovrei usare anche C ++?
Risposte:
Ecco perché: HipHop per PHP: muoviti velocemente :
Uno dei valori chiave su Facebook è muoversi velocemente. Negli ultimi sei anni, siamo stati in grado di fare molto grazie al rapido ritmo di sviluppo offerto da PHP. Come linguaggio di programmazione, PHP è semplice. Semplice da imparare, semplice da scrivere, semplice da leggere e semplice da eseguire il debug. Siamo in grado di far accelerare i nuovi ingegneri su Facebook molto più velocemente con PHP che con altre lingue, il che ci consente di innovare più velocemente.
Oggi sono entusiasta di condividere il progetto con un piccolo team di persone fantastiche e ho lavorato negli ultimi due anni; HipHop per PHP. Con HipHop abbiamo ridotto l'utilizzo della CPU sui nostri server Web in media di circa il cinquanta percento, a seconda della pagina. Meno CPU significa meno server, il che significa meno sovraccarico. Questo progetto ha avuto un impatto enorme su Facebook. Riteniamo che il Web in generale possa beneficiare di HipHop, quindi lo rilasceremo come open source questa sera nella speranza che porti un nuovo focus verso il ridimensionamento di grandi siti Web complessi con PHP. Mentre HipHop ci ha mostrato risultati incredibili, non è certamente completo e dovresti sentirti a tuo agio con il software beta prima di provarlo.
HipHop per PHP non è tecnicamente un compilatore stesso. Piuttosto è un trasformatore di codice sorgente. HipHop trasforma a livello di codice il codice sorgente PHP in C ++ altamente ottimizzato e quindi utilizza g ++ per compilarlo. HipHop esegue il codice sorgente in modo semanticamente equivalente e sacrifica alcune funzionalità usate raramente - come eval () - in cambio di prestazioni migliorate. HipHop include un trasformatore di codice, una reimplementazione del sistema di runtime di PHP e una riscrittura di molte estensioni PHP comuni per sfruttare queste ottimizzazioni delle prestazioni.
Scalare PHP come linguaggio di scripting
Le radici di PHP sono quelle di un linguaggio di scripting, come Perl, Python e Ruby, che hanno tutti grandi vantaggi in termini di produttività del programmatore e capacità di iterare rapidamente sui prodotti. Questo viene confrontato con linguaggi compilati più tradizionali come C ++ e linguaggi interpretati come Java. D'altro canto, i linguaggi di scripting sono generalmente meno efficienti in termini di utilizzo della CPU e della memoria. Per questo motivo, è stato difficile ridimensionare Facebook a oltre 400 miliardi di visualizzazioni di pagine basate su PHP ogni mese.
Un modo comune per affrontare queste inefficienze è riscrivere le parti più complesse dell'applicazione PHP direttamente in C ++ come estensioni PHP. Questo in gran parte trasforma PHP in un linguaggio colla tra il tuo front-end HTML e la logica dell'applicazione in C ++. Da un punto di vista tecnico funziona bene, ma riduce drasticamente il numero di ingegneri che sono in grado di lavorare sull'intera applicazione. L'apprendimento del C ++ è solo il primo passo per scrivere le estensioni di PHP, il secondo è capire le API di Zend. Dato che il nostro team di ingegneri è relativamente piccolo - ci sono oltre un milione di utenti per ogni ingegnere - non possiamo permetterci di rendere parti della nostra base di codice meno accessibili di altre.
Il ridimensionamento di Facebook è particolarmente impegnativo perché quasi tutte le visualizzazioni di pagina sono utenti connessi con un'esperienza personalizzata. Quando visualizzi la tua home page, dobbiamo cercare tutti i tuoi amici, interrogare i loro aggiornamenti più rilevanti (da un servizio personalizzato che abbiamo creato chiamato Multifeed), filtrare i risultati in base alle tue impostazioni sulla privacy, quindi compilare le storie con commenti , foto, Mi piace e tutti i dati ricchi che le persone amano di Facebook. Tutto questo in poco meno di un secondo. HipHop ci consente di scrivere la logica che esegue l'assemblaggio della pagina finale in PHP e di iterarlo rapidamente facendo affidamento su servizi di back-end personalizzati in C ++, Erlang, Java o Python per servire il feed di notizie, la ricerca, la chat e altre parti principali del sito.
Dal 2007 abbiamo pensato a diversi modi per risolvere questi problemi e abbiamo persino provato a implementarne alcuni. Il suggerimento comune è di riscrivere Facebook in un'altra lingua, ma data la complessità e la velocità di sviluppo del sito, ciò richiederebbe del tempo per essere realizzato. Abbiamo riscritto aspetti di Zend Engine - gli interni di PHP - e contribuito con quelle patch nel progetto PHP, ma alla fine non abbiamo visto il tipo di aumenti delle prestazioni necessari. I vantaggi di HipHop sono quasi trasparenti alla nostra velocità di sviluppo.
Hacking Up HipHop
Una notte a un Hackathon qualche anno fa (vedi Prime Time Hack), ho iniziato il mio primo pezzo di codice trasformando PHP in C ++. I linguaggi sono abbastanza simili sintatticamente e il C ++ supera drasticamente PHP quando si tratta sia dell'utilizzo della CPU che della memoria. Anche lo stesso PHP è scritto in C. Sapevamo che era impossibile riscrivere a mano un'intera base di codice di queste dimensioni a mano, ma ci chiedevamo cosa sarebbe successo se avessimo costruito un sistema per farlo programmaticamente.
Trovare nuovi modi per migliorare le prestazioni di PHP non è un nuovo concetto. In fase di esecuzione, Zend Engine trasforma la sorgente PHP in codici operativi che vengono quindi eseguiti attraverso la macchina virtuale Zend. I progetti open source come APC ed eAccelerator memorizzano nella cache questo output e sono utilizzati dalla maggior parte dei siti Web basati su PHP. C'è anche Zend Server, un prodotto commerciale che rende PHP più veloce tramite l'ottimizzazione del codice operativo e la memorizzazione nella cache. Invece, stavamo pensando di trasformare la fonte PHP direttamente in C ++ che può quindi essere trasformata in codice macchina nativo. Anche compilare PHP non è una nuova idea, progetti open source come Roadsend e phc compilano PHP in C, Quercus compila PHP in Java e Phalanger compila PHP in .Net.
Inutile dire che ci è voluto più tempo di quel singolo Hackathon. Otto mesi dopo, avevo abbastanza codice per dimostrare che è davvero possibile eseguire più velocemente con il codice compilato. Abbiamo rapidamente aggiunto Iain Proctor e Minghui Yang al team per accelerare il ritmo del progetto. Abbiamo trascorso i prossimi dieci mesi a completare tutta la codifica e i successivi sei mesi a testare su server di produzione. Siamo orgogliosi di poter dire che a questo punto stiamo servendo oltre il 90% del nostro traffico Web utilizzando HipHop, tutti solo sei mesi dopo la distribuzione.
Come funziona HipHop
La principale sfida del progetto era colmare il divario tra PHP e C ++. PHP è un linguaggio di scripting con una digitazione dinamica e debole. C ++ è un linguaggio compilato con tipizzazione statica. Mentre PHP ti consente di scrivere caratteristiche dinamiche magiche, la maggior parte di PHP è relativamente semplice. È più probabile che tu veda
if (...) {...} else {..}
di quanto non lo siafunction foo($x) { include $x; }
. Questo è dove guadagniamo in termini di prestazioni. Ove possibile, il nostro codice generato utilizza l'associazione statica per funzioni e variabili. Usiamo anche l'inferenza di tipo per scegliere il tipo più specifico possibile per le nostre variabili e quindi risparmiare memoria.Il processo di trasformazione comprende tre passaggi principali:
- Analisi statiche in cui raccogliamo informazioni su chi dichiara cosa e dipendenze,
- Digita l'inferenza in cui scegliamo il tipo più specifico tra scalari C ++, String, Array, classi, Object e Variant e
- Generazione di codice che per la maggior parte è una corrispondenza diretta da istruzioni ed espressioni PHP a istruzioni ed espressioni C ++.
Abbiamo anche sviluppato HPHPi, un interprete sperimentale progettato per lo sviluppo. Quando si utilizza HPHPi non è necessario compilare il codice sorgente PHP prima di eseguirlo. Ci ha aiutato a rilevare bug nello stesso HipHop e offre agli ingegneri un modo per usare HipHop senza cambiare il modo in cui scrivono PHP.
HipHop globale ci consente di mantenere i migliori aspetti di PHP sfruttando al contempo i vantaggi in termini di prestazioni del C ++. In totale, abbiamo scritto oltre 300.000 righe di codice e oltre 5.000 test unitari.
Risposta breve: no, non è necessario C ++.
Credo che ti riferisci a HipHop . Se leggi i miglioramenti che offre, è circa il 50%. Questo è molto importante se sei Facebook che ha migliaia di server frontend. Ridurre il carico su di essi significa milioni di risparmi sui data center. Nel caso di società con 10-100 server frontend, i costi di sviluppo supererebbero notevolmente i possibili risparmi. Comunque, l'elaborazione più pesante viene eseguita nel back-end, che di solito è una soluzione RDBMS o NoSQL, sviluppata come codice C / C ++ altamente ottimizzato.
Ovviamente avrebbero potuto ottenere risparmi molto più elevati scaricando completamente PHP. Ma questo non è qualcosa che puoi fare con un'enorme base di codice, come nel caso di Facebook.
Ora, per l'altra parte della domanda: se vuoi davvero sapere come gestire carichi enormi, leggi il blog High Scalability , in particolare la parte Real Life Architectures.
È possibile con PHP, ma sicuramente non sarebbe la mia scelta. Se vuoi un linguaggio dinamico, Python, Ruby o forse Lua sarebbe la scelta migliore.
La cosa bella dell'approccio di FB è che non hanno dovuto decidere subito. Dovresti fare lo stesso. Scegli la lingua che ti rende più produttivo, ma assicurati che si interfaccia facilmente con C / C ++.
Una volta che hai milioni di utenti e hai bisogno di eliminare i millisecondi dai tempi di risposta, puoi ottimizzare i percorsi critici usando C / C ++.
L'elemento C ++ utilizzato da Facebook è l'HHVM.
Questa è la macchina virtuale HIPHOP. Sebbene scritto in C ++, è essenzialmente un "migliore interprete PHP".
Il codice php viene compilato in codice byte che viene quindi interpretato dall'HHVM al momento dell'esecuzione ed è soggetto alle ottimizzazioni "Just In Time" durante l'esecuzione.
Gli sviluppatori di Face Book scrivono ancora principalmente in PHP e, ciò che vedi sul tuo browser è quasi sicuramente prodotto da un programma PHP, anche se è stato compilato e interpretato dal runtime HHVM.
L'attuale HHVM è open source disponibile gratuitamente. Quindi, se hai bisogno di servire un milione di immagini di gattini all'ora, puoi scaricare l'HHVM e velocizzare il tuo server con una modifica minima al tuo PHP.