Facebook è probabilmente il più grande sito web a far ampio uso di PHP. Questo è nato come un linguaggio di scripting, per realizzare velocemente e più semplicemente siti web da Rasmus Lerdof nel “lontano” 1995. Caratteristiche di spicco per l’epoca erano l’allocazione dinamica del tipo di variabile e l’assenza di compilazione. È sufficente modificare il file e eseguire la pagina web.
Chiaramente queste, sono caratteristiche che se da un lato rendono più semplice e alla portata di chiunque sviluppare un sito web, dall’altro incidono pesantemente sulle prestazioni. Il motore Zend (cioè l’interprete standard di PHP) deve verificare in ogni uso della variabile il suo tipo, e convertirla nel tipo giusto in base all’impiego. Per quanto il linguaggio di programmazione possa fingere l’assenza dei tipi, (numero, stringa, carattere, array) a livello di esecuzione non è possibile farlo.
Queste caratteristiche sebbene incidono (insieme a molte altre di php) parecchio sulle prestazioni, non sono mai state in genere un grande problema. Basti pensare che nel 1995, la gente aveva ancora linee 56k, quindi i tempi di esecuzione della pagine erano trascurabili e comunque i siti avevano un architettura molto più semplice.
Tutt’oggi i problemi di prestazioni di PHP, non risultano poi così gravi, tant’è che è la piattaforma di sviluppo web più diffusa al mondo. Si è in parte migliorata la situazione introducendo l’opcode caching (In pratica php interpreta solo la prima volta il codice, il risultato viene salvato in ram, in modo da non dover ripetere questa onerosa operazione nelle richieste successive ) e il caching delle pagine con Varnish e Nginx.
Queste soluzioni, vanno bene sicuramente per il 90% dei siti web, che al massimo funzionano su 5-6 server, ma sicuramente non per Facebook. Infatti su grandi infrastrutture composte da migliaia di server, il risparmio dato dall’eseguire, per esempio, il codice nella metà del tempo, permette di dimezzare il numero dei server. Un bel risparmio di server, energia e personale che si occupa della gestione.
Facebook già subito dopo aver raggiunto la notorietà, si è trovata davanti un bivio, cambiare piattaforma passando a un linguaggio più performante, o riscrivere PHP. Sebbene può apparite scontata la prima scelta, bisogna anche tener conto che di sviluppatori PHP se ne trovano tantissimi e quindi più a buon mercato. Così fù sviluppato HipHop per PHP, e fù anche rilasciato al pubblico con licenza open source. Praticamente si trattava di un convertitore, che convertiva il codice PHP in C++ e infine lo compilava in un eseguibile. Chiaramente convertendo il codice PHP in codice macchina, le prestazioni migliorano drastisticamente. Facebook, sostennè di aver raggiunto il 600% di prestazioni rispetto a PHP standard.
Sebbene Facebook aveva annunciato HipHop come la grande promessa per il futuro di PHP, pochi mesi dopo il progetto fu abbandonato. La creazione di un eseguibile da distribuire sui server (anche di 1GB) non risultava pratica, oltre a risultare molto più complesso il sistema di debugging, che richiedeva di fatto lo sviluppo una piattaforma hiphop apposita. Inoltre data la natura di HipHop, funzioni come eval() o create_function() non potevano essere implementate, poichè chiaramente non portabili in C++, essendo funzioni che permettono l’esecuzione come codice di stringhe e che chiaramente in una piattaforma dove il codice è già compilato, risulta impossibile compilarla in qualche modo. Anche per quanto riguarda i miglioramenti di prestazioni non si riusciva ad andare più oltre, così si il team decise di deprecare HipHop.
E qui entra in scena HHVM (HipHop Virtual Machine), che ha raccolto i “cocci” del progetto HipHop, cambiando radicalmente filosofia. Anzichè convertire il codice in C++, è stata creato un motore di esecuzione JIT, un pò come quello che usano Java e ASP.NET.
In sostanza HHVM converte gli script php internamente in una specie di pseudo codice, molto vicino a quello del linguaggio macchina. Questo viene poi fornito al compilatore JIT, che lo analizza e lo ottimizza per la CPU su cui viene eseguito. Questo nuovo sistema ha semplificato il sistema di debugging e permesso di raggiungere prestazioni ancora più elevate di prima. Il maggior risultato è che consente di implementare tutte le funzioni di PHP, e quindi fra non molti mesi, risulterà totalmente compatibile.
Praticamente non vi è più alcuna differenza nell’utilizzare PHP Zend e PHP HHVM. Si carica il sito sul server, si installa HHVM, e lo si usa come un normale modulo FastCGI. La compatibilità con PHP, allo stato attuale non è ancora al 100%, anche se il Team di Facebook, sta facendo il massimo per rendere HHVM totalmente compatibile, passando gli unit test dei maggiori framework e applicazioni PHP. Slim, Laravel, WordPress, Codeigniter e altri risultano già pienamente compatibili.
Raggiunta questa ottimizzazione il Team di Facebook ha pensato di andare oltre. PHP ha dei limiti strutturali che riguardano proprio la sua sintassi. Infatti non è possibile neppure in modo opzionale specificare il tipo delle variabili (cosa che permette di aumentare le prestazioni e ridurre i bug), mancano funzioni async e molte altre caratteristiche presenti in altri linguaggi. Così hanno creato HACK, che non è altro che un PHP esteso. Questo linguaggio era già utilizzato da Facebook internamente da molti mesi, e quel poco che se ne sapeva lo si era ottenuto studiando il codice di HHVM come avevo fatto io stesso. Adesso è invece stato rilasciato pubblicamente con tutta la documentazione necessaria.
Chiaramente ha il supporto per i tipi statici, per le espressioni lamba, per funzioni asincrone e molto altro. Sul sito del linguaggio vi è tutta la documentazione.
I prossimi passi per il Team sono raggiungere la “parità” cioè il supporto completo al 100% di PHP, in particolare dei suoi maggiori framework. A questo obiettivo si può contribuire, essendo un progetto open source, inviando le proprie modifiche e correzioni su GitHub.
Di sicuro HHVM è all’inizio, e le sue caratteristiche fanno presupporre e sperare che presto potrà rimpiazzare PHP in numerosi casi. Lo stesso fondatore di PHP pensa che in un futuro i due progetti possano convergere e fondersi.
Con la stabilità e compatibilità raggiunta (la versione 3.0 dovrebbe essere rilasciata a giorni) spero di poter implementare nelle prossime settimane la piattaforma su questo stesso sito web, per provarne in produzione i miracolosi risultati.