it-swarm.it

Perché Facebook ha usato il C ++ accanto a PHP?

Qual è il motivo principale che ha reso Facebook necessario utilizzare C++ accanto a PHP? Mi chiedo se dovrei creare un sito Web con molti visitatori, dovrei usare anche C++?

15
Goma

Ecco perché: HipHop per PHP: Move Fast :

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 che 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 ottenere nuovi ingegneri su Facebook molto più velocemente con PHP rispetto ad altre lingue, il che consente noi per 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 programmaticamente il tuo PHP in C++ altamente ottimizzato e quindi usa 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 un riscrivere molti comuni PHP estensioni per sfruttare queste ottimizzazioni delle prestazioni.

Ridimensionamento 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'altra parte, 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 ovviare a queste inefficienze è riscrivere le parti più complesse della tua PHP direttamente in C++ come PHP. Questo trasforma in gran parte PHP in un linguaggio colla tra il tuo front-end HTML e la logica dell'applicazione in C++. Da un punto di vista tecnico questo funziona bene, ma riduce drasticamente il numero di ingegneri che sono in grado di lavorare su tutta la tua applicazione. L'apprendimento del C++ è solo il primo passo per scrivere PHP Extensions, 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 la pagina finale Assembly in PHP e iterarla rapidamente facendo affidamento su servizi di back-end personalizzati in C++, Erlang, Java o Python per servire il feed delle 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 alcuni 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 trasparente 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++. Le lingue sono abbastanza simili sintatticamente e C++ supera drasticamente PHP quando si tratta sia di utilizzo della CPU che della memoria. Anche PHP stesso è scritto in C. Sapevamo che era impossibile riscrivere con successo un'intera base di codice di queste dimensioni mano, ma mi chiedevo cosa sarebbe successo se avessimo costruito un sistema per farlo programmaticamente.

Trovare nuovi modi per migliorare PHP non sono un nuovo concetto. In fase di esecuzione, Zend Engine trasforma la tua fonte PHP in codici operativi che vengono quindi eseguiti attraverso Zend Virtual Machine. 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 PHP direttamente in C++ che può quindi essere trasformata in codice macchina nativo. Anche compilazione PHP non è una nuova idea, progetti open source come Roadsend e phc compile PHP in C, Quercus compila PHP in Java e Phalanger compila PHP a .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 sui 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 sfida principale 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 permette di scrivere caratteristiche dinamiche magiche, la maggior parte PHP è relativamente semplice. È più probabile che tu veda if (...) {...} else {..} di quanto non sia vedere function foo($x) { include $x; }. Qui è dove otteniamo prestazioni. Ogni volta che è 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 risparmia memoria.

Il processo di trasformazione comprende tre passaggi principali:

  1. Analisi statiche in cui raccogliamo informazioni su chi dichiara cosa e dipendenze,
  2. Digita l'inferenza in cui scegliamo il tipo più specifico tra scalari C++, String, Array, classi, Object e Variant e
  3. Generazione di codice che per la maggior parte è una corrispondenza diretta da PHP ed espressioni 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 PHP prima di eseguirlo. Ci ha aiutato a individuare bug nello stesso HipHop e offre agli ingegneri un modo per utilizzare HipHop senza cambiare il modo in cui scrivono PHP.

Nel complesso HipHop ci consente di mantenere i migliori aspetti di PHP sfruttando i vantaggi in termini di prestazioni del C++. In totale, abbiamo scritto oltre 300.000 righe di codice e oltre 5.000 test unitari.

20
Trinidad

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 semplicemente scaricando PHP completamente. Ma questo non è qualcosa che puoi fare con una base di codice enorme, come nel caso di Facebook.

Ora, per l'altra parte della domanda: se vuoi davvero sapere come gestire carichi enormi, leggi blog ad alta scalabilità , 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 una scelta molto migliore.

13
vartec

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 ridurre i millisecondi dei tempi di risposta, puoi ottimizzare i percorsi critici usando C/C++.

6
Scant Roger

L'elemento C++ utilizzato da Facebook è l'HHVM.

Questa è la macchina virtuale HIPHOP. Sebbene sia 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 - comunque su cui è 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.

0
James Anderson