Lezioni di informatica

Una selezione di compilatori online: eseguiamo e testiamo il codice direttamente nel browser. Esempio di esecuzione della compilazione di script PHP

Tutti i compilatori PHP gratuiti presentati qui possono ricostruire script PHP in codice macchina che può essere eseguito su un computer senza scaricare uno speciale interprete PHP, o compilarli in un'interfaccia a riga di comando bytecode (per l'installazione è richiesto il framework NET o Mono o il bytecode Java) (dove per l'installazione è richiesta una Java Virtual Machine)).

Tali compilatori possono essere utili per vari scopi: possono velocizzare l'esecuzione dello script perché non vengono più interpretati in fase di runtime; oppure grazie ad essi potrai distribuire le tue applicazioni senza rivelare il codice sorgente (come richiedono altri script commerciali). Suppongo che siano adatti anche nel caso in cui qualcuno voglia scrivere programmi PHP dipendenti dal web e distribuirli con la funzionalità di esecuzione sul desktop (al contrario delle normali applicazioni web che funzionano su un server), tutto questo è possibile perché così PHP è un linguaggio di programmazione facile da imparare e contiene fondamentalmente molte funzioni integrate con accesso a Internet. (In questo caso, dovrai distribuire le applicazioni con un server Web integrato o utilizzare un compilatore che compili il server nella tua applicazione.)

A proposito, se desideri utilizzare l'offuscamento nel tuo codice, sappi che ciò è possibile anche durante l'utilizzo Acceleratore PHP. Tali acceleratori implicano anche un aumento della velocità di esecuzione dello script.

Informazioni utili per chi ancora non sapesse che la versione ufficiale del traduttore PHP è scaricabile dal sito PHP: Processore di ipertesto.

Compilatori PHP gratuiti per comporre codice nativo, script bytecode .NET o Java.

Bambalam (nuovo)

Questo programma produce applicazioni Windows EXE autonome per il tuo codice sorgente PHP. Non è realmente un compilatore di codice nativo poiché codifica semplicemente il codice sorgente e incorpora un interprete PHP, ma è sicuramente una buona soluzione per chi cerca compilatori nativi e di codice byte. Al momento della scrittura dell'intero programma, il suo ambiente di esecuzione era la versione integrata di PHP 4.4.4 (il programma non veniva aggiornato dal 2006). Il codice sorgente di Bambalam è disponibile pubblicamente.

Falange (per .NET)

Phalanger compila il tuo codice PHP in bytecode CLI (.exe o .dll). Questo programma può essere eseguito tramite framework .NET 4.0 o Mono. Il tuo codice PHP può utilizzare qualsiasi oggetto .NET e librerie di estensioni PHP standard aggiuntive. L'assembly NET risultante può essere firmato o nascosto. Il programma produce anche modelli che consentono di creare applicazioni PHP utilizzando Visual Studio. Il programma è rilasciato sotto la licenza Apache.

HipHop per PHP (per codice nativo)

HipHop traduce il tuo codice PHP in codice C++, che viene successivamente compilato utilizzando il compilatore GNU C++ in codice binario eseguibile. Il compilatore supporta tutte le funzionalità di PHP 5.3 (eccetto ovviamente cose come valutazione()). Funziona e compila codice per Linux a 64 bit e FreeBSD. Poiché il programma è distribuito sotto forma di codice sorgente, dovrai compilarlo manualmente (tu stesso). È rilasciato sotto la licenza PHP.

Roadsend PHP (per codice nativo).

Il compilatore PHP Roadsend produce binari nativi (eseguibili) per Windows e Linux. I tuoi script non si limitano ai programmi console (righe di comando): possono essere creati utilizzando server Web incorporati, consentendo loro di essere eseguiti nello stesso modo in cui vengono eseguiti su un sito Web, anche se sul tuo sistema utente. Il compilatore è rilasciato sotto la licenza GNU GPL e funziona sotto GNU LGPL. Sfortunatamente, il programma ha interrotto il suo sviluppo attivo.

Progetto Zero (per Java)

(Nota: questo software sembra essere defunto. Il sito è inaccessibile da circa sei mesi ormai.) Project Zero include un compilatore e un CLR in grado di compilare il codice PHP in bytecode Java ed eseguirlo. Tieni presente che Project Zero è più di un semplice compilatore/runtime PHP; fornisce un ricco framework che ti consente di migliorare le applicazioni web utilizzando PHP o Groovy (un altro linguaggio di scripting). Questo compilatore è disponibile per Windows, Mac OS X e Linux. Per lavorare con questo compilatore, dovrai scaricare il Java Development Kit.

Quale dei compilatori proposti preferisci? Oppure hai un altro traduttore preferito? Lascia le tue osservazioni e commenti qui sotto, saremo felici di leggerli e raccoglierli.

tag: Compilatori PHP, traduzione di script

Esistono due tipi di linguaggi di programmazione: interpretati e compilati. Che linguaggio è PHP? Per rispondere a questa domanda dobbiamo comprendere la terminologia.

Un programma che traduce il codice scritto in un linguaggio di programmazione in un altro è chiamato traduttore. Un compilatore è anche un traduttore. Traduce il codice scritto in un linguaggio di alto livello in codice macchina. Il processo di compilazione crea un file eseguibile binario che può essere eseguito senza un compilatore.

Un interprete è una categoria completamente diversa. L'interprete non traduce il codice, ma lo esegue. L'interprete analizza il codice del programma ed ne esegue ogni riga. Ogni volta che esegui tale codice, devi utilizzare un interprete.

In termini di prestazioni, gli interpreti sono significativamente inferiori ai compilatori, poiché il codice binario viene eseguito molto più velocemente. Ma gli interpreti ti consentono di controllare completamente il programma durante la sua esecuzione.

Per quanto riguarda PHP, non è né un compilatore né un interprete. PHP è un incrocio tra un compilatore e un interprete. Proviamo a capirlo e osserviamo come PHP elabora il codice.

Diamo un'occhiata all'immagine:

Vediamo che PHP è composto da due blocchi quasi indipendenti: un traduttore e un interprete. Perché hai avuto bisogno di farlo? Ovviamente per ragioni di velocità.

L'input PHP è uno script. Lo traduce (lo traduce), controllandone la sintassi, in uno speciale bytecode (rappresentazione interna). PHP esegue quindi il bytecode (non il codice del programma stesso), ma non crea un file eseguibile.

Il bytecode è molto più compatto del normale codice di programma, quindi è più facile (e veloce) da interpretare (eseguire). Giudicate voi stessi: l'analisi viene eseguita solo una volta nella fase di traduzione e viene eseguito il "prodotto semilavorato" - bytecode, che è molto più conveniente per questi scopi. Pertanto, PHP è più un interprete che un compilatore. Questa “doppia opera” si è resa necessaria per i seguenti scopi.

Considera il ciclo:

Per (i=0;i<10; i++) { Operator_1; Operator_2; Operator_3; ............ Operator_99; Operator_100; }

Questo ciclo “girerà” 10 volte. Per ognuno di questi dieci passaggi, l'interprete deve 100 righe di codice. E deve analizzare ed eseguire 10*100 = 1000 righe di codice! Se converti l'intero ciclo in bytecode una volta, dovrà essere analizzato 10 volte meno! Ciò significa che gli script verranno eseguiti 10 volte più velocemente!

Si scopre che PHP lo è.

La fase principale del lavoro di PHP è l'interpretazione della rappresentazione interna del programma e la sua esecuzione. È questa fase che richiede più tempo negli scenari gravi. Tuttavia il rallentamento non è così significativo.

Vale la pena ricordare che PHP versione 3 era un interprete “puro” e con PHP 4 gli script hanno iniziato a essere eseguiti molto più velocemente, poiché PHP versione 4 (e PHP5) è un traduttore interpretativo.

Il linguaggio Perl, che viene quasi sempre chiamato compilatore, funziona esattamente allo stesso modo: traduce il testo del programma in una rappresentazione interna e quindi utilizza il codice risultante durante l'esecuzione. Quindi possiamo dire che PHP versione 4 è un compilatore esattamente nello stesso modo in cui lo è Perl.

Quindi, siamo costretti a concludere che PHP è un interprete con un blocco di traduzione integrato che ottimizza il flusso di interpretazione.

Usare un interprete (e quindi PHP) ha i suoi innegabili vantaggi:

  • Non è necessario preoccuparsi di liberare la memoria allocata, non è necessario chiudere i file una volta finito di lavorarci: l'interprete eseguirà tutto il lavoro di routine, poiché il programma viene eseguito sotto il suo vigile controllo;
  • Non è necessario pensare ai tipi di variabile e non è necessario dichiarare una variabile prima del suo primo utilizzo;
  • Il debug dei programmi e il rilevamento degli errori sono notevolmente semplificati: l'interprete ha il controllo completo su questo processo;
  • Nell'ambito delle applicazioni web l'interprete ha anche un vantaggio molto importante: non c'è pericolo che il server si blocchi se il programma non funziona correttamente.

Ci sono anche altri vantaggi. In generale, l'utilizzo di un interprete può conferire agli script la potenza che gli utenti Web si aspettano da essi.

La penalità prestazionale di PHP è evidente nel caso di loop grandi e complessi, quando si elaborano un gran numero di righe, ecc. Tuttavia, tieni presente che questo è l'unico inconveniente di PHP, che apparirà sempre meno man mano che verranno rilasciati processori più potenti , tanto che alla fine scompariranno del tutto.

<<< Назад
(Cosa c'è di nuovo in PHP5?)
Contenuto Avanti >>>
(Transizione a PHP 5.3)

Se hai altre domande o qualcosa non è chiaro, benvenuto nel ns

PHP è un linguaggio di programmazione interpretato; ad ogni richiesta, il codice sorgente viene analizzato ed “eseguito”. Questo approccio, ovviamente, è molto conveniente nella fase di sviluppo del progetto, ma introduce un passaggio aggiuntivo nel processo di esecuzione del codice di produzione. Pertanto, l'interpretazione, che a prima vista è il punto di forza di PHP, costa tempo e risorse extra alla CPU.

Di seguito parleremo dei compilatori che consentono di compilare il codice PHP in C++ e quindi in codice eseguibile. Pertanto, le applicazioni PHP vengono eseguite direttamente dal processore, bypassando l'interprete.

Controlliamo se tutto va bene nella pratica.

Come lavora l'interprete

L'interpretazione del codice PHP avviene in due fasi:

  1. Analisi del codice e generazione di codici operativi (codici operativi Zend) - istruzioni comprensibili all'interprete.
  2. Esecuzione di codici operativi.

Mentre la prima fase si presta bene all'ottimizzazione (usando una cache opcode), la seconda è abbastanza chiusa: l'interprete è sempre un intermediario tra l'insieme di istruzioni e il processore che le esegue. Senza un interprete, il processore non può capire cosa fare con i codici operativi.

Per eliminare il collegamento dell'interprete sono stati inventati i compilatori, il più popolare e recente dei quali è HipHop di Facebook. Sentiamolo più vicino.

HipHop PHP

HipHop è scritto dagli sviluppatori di Facebook ed è un'applicazione che:
  1. ottimizza il codice PHP
  2. si converte in C++
  3. genera dalla tua applicazione un server web multi-thread che la esegue
  4. compila in codice eseguibile utilizzando g++

Pertanto, l'input è il codice PHP, l'output è un server, parte del quale è la funzionalità scritta.

Controlliamo come HipHop può gestire la compilazione di un'applicazione scritta utilizzando un framework, come Wordpress.

Compilazione Wordpress

Dopo aver installato HipHop, nella cartella src/hphp/ otterremo il file hpp, che è il compilatore. Prima che inizi la compilazione, imposta le variabili di ambiente:

Cd .. # vai alla cartella con hiphop export HPHP_HOME=`pwd` export HPHP_LIB=`pwd`/bin export CMAKE_PREFIX_PATH=`/bin/pwd`/../

e vai avanti!

Scarica Wordpress e decomprimi l'archivio:

Wget http://wordpress.org/latest.tar.gz tar zxvf latest.tar.gz

Copia wp-config-sample.php in wp-config.php e specifica le impostazioni per la connessione al database (nelle impostazioni host specifichiamo 127.0.0.1, non localhost).

Per una compilazione di successo è necessario patchare leggermente Wordpress:

  1. Apri wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php e sostituisci: function &loopback(/* args.. */) ( return func_get_args(); ) con la funzione &loopback(/* args.. */ ) ( $ret = func_get_args(); return $ret; )
  2. In wp-includes/query.php, invece di if (!isset($q["suppress_filters"])) $q["suppress_filters"] = false; inserisci $q["suppress_filters"] = true;

WordPress è pronto.

Hiphop deve specificare l'elenco dei file che compileremo: lo otterremo e lo salveremo in files.list:

Trovare. -nome "*.php" > file.list

Tutto è pronto per la compilazione, procediamo:

$HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 --force=1 --cluster-count=50

Dopo aver completato il comando, nella cartella temporanea (all'inizio della compilazione, hphp mostrerà il suo percorso, qualcosa del tipo “/tmp/hphp_ptRgV1”) riceveremo un server web compilato. Lanciamolo (se qualcosa è bloccato sulla porta 80, ad esempio apache o nginx, devi prima fermarlo per liberare la porta):

Sudo /tmp/hphp_6s0pzd/program -m server -v "Server.SourceRoot=`pwd`" -v "Server.DefaultDocument=index.php" -c $HPHP_HOME/bin/mime.hdf

Ecco! Andando su http://localost vedremo un blog Wordpress funzionante.

Prestazione

Vediamo se ci sarà un aumento delle prestazioni rispetto alla versione non compilata di WordPress in esecuzione su apache2. Di seguito sono riportati i grafici della dipendenza della velocità di generazione della pagina dal numero di utenti paralleli.

Come puoi vedere, i risultati sono stati scioccanti: il blog compilato funziona in media 6 volte più velocemente! Il numero medio di richieste elaborate al secondo nella versione non compilata è 9 e nella versione compilata è 50! Non so voi, ma questi risultati mi hanno stupito; non mi aspettavo un incremento prestazionale così forte.

Riassumere

Dopo risultati così sorprendenti si può dire solo una cosa: i ragazzi di Facebook hanno fatto un ottimo lavoro. Il compilatore rende davvero un'applicazione un razzo e, sebbene l'applicazione debba essere preparata prima della compilazione, ne vale la pena.

Al punto:

Se ti è piaciuto il post, clicca su Google +1: mi darà più motivazione a scrivere e sarà semplicemente un piacere.

Alexey Romanenko: Mi chiamo Alexey Romanenko, lavoro alla RBC. L’argomento di questo rapporto è alquanto controverso. Sembrerebbe, perché compilare script PHP quando tutto sembra funzionare così?

Probabilmente la domanda principale è: “Perché?” In generale, lo scopo di questa presentazione è cercare di capire se tale compilazione è necessaria, in caso affermativo, perché, in quale forma e a chi.

Cos'è un compilatore PHP?

Innanzitutto, una breve panoramica di cosa sia un compilatore PHP. Ti dirò come funziona, cos'è e come puoi accelerarlo.

Il primo modulo funzionale è il cosiddetto SAPI (Server API), che fornisce un'interfaccia per l'accesso a PHP da vari client (Apache, una sorta di server CGI (Common Gateway Interface) e altri). C'è anche SAPI incorporato, che ti consente di incorporare PHP in qualsiasi applicazione.

La seconda parte principale è PHP Core, che elabora le richieste, implementa tutto il lavoro con la rete, il file system e analizza gli script stessi.

La terza parte globale è lo Zend Engine, che compila i nostri script in bytecode, lo esegue sulla sua macchina virtuale e gestisce la gestione della memoria (implementa allocatori completi).

Una delle parti più importanti e più grandi è il modulo Estensioni, che implementa il 99% di ciò che utilizziamo in PHP. Questi sono "wrapper" per alcune librerie, o funzionalità, o classi, librerie integrate, ecc. Possiamo anche scrivere le nostre estensioni.

Come viene eseguito lo script stesso?

Primo. Si verifica l'analisi lessicale: il file viene scaricato, analizzato, tutti i caratteri dell'insieme di questo file vengono tradotti in un determinato insieme di token, con cui poi lavoriamo.

La fase di analisi analizza questi token. Sulla base di questa analisi viene compilata una determinata struttura grammaticale, sulla base della quale verrà poi generato il bytecode.

Alla fine, Zend Engine lo esegue. Il risultato viene restituito al client.

Stiamo parlando di carichi elevati. Se ripeti questo schema di azioni ogni volta, tutto funzionerà molto lentamente. Quando il nostro interprete riceve diverse centinaia o migliaia di richieste contemporaneamente, la velocità è semplicemente inesistente.

Ma ci sono soluzioni. Sono conosciuti da molto tempo.

Come ottenere l'accelerazione?

La soluzione più semplice, economica e ben testata è il caching del bytecode. Invece di passare attraverso la fase di analisi, memorizziamo semplicemente nella cache il nostro bytecode. Per questo ci sono estensioni speciali - sono ben note a tutti coloro che hanno lavorato con PHP - queste sono APC, eAccelerator, Xcache e così via. Zend Engine esegue semplicemente il bytecode.

La seconda opzione è la profilazione del codice, identificando i colli di bottiglia. Possiamo riscrivere qualcosa come estensioni PHP (questa sarà un'estensione in C/C++), compilarla e usarla come moduli.

La terza opzione è più globale: dimentica PHP e riscrivi tutto. In generale, questa opzione ha diritto alla vita, ma solo nel caso in cui non ci sia abbastanza codice PHP. Nei progetti grandi e grandi (o che esistono da molto tempo), di solito se ne accumula molto e ci vorrà molto tempo per riscrivere tutto. I requisiti aziendali non ti consentiranno di farlo. In generale, scrivere qualcosa in PHP, ad esempio per un server front-end, non richiede molto tempo, perché è un linguaggio semplice. Ti consente di fare rapidamente cose che richiedono più tempo per essere eseguite nelle lingue di basso livello.

Esiste un'opzione alternativa, che recentemente è diventata molto diffusa, ed è quella di compilare PHP da qualche parte, in qualcosa di più veloce.

Compiliamo qualcosa?

Con la parola “compilazione” intendo la traduzione del codice dello script PHP in qualcos'altro, in qualche altro codice.

In questo caso può essere di due tipi.

Il codice nativo è un tipo di file binario che può essere eseguito su una macchina fisica.

Codice non nativo. È possibile compilare del bytecode che può essere eseguito su un'altra macchina virtuale, ad esempio sulla JVM.

Come puoi compilare codice nativo da PHP?

Compilatore Roadsend. Il suo seguito è Raven. C'è anche PHC (questo è un compilatore PHP Open Source). Recentemente è apparso anche HipHop (Facebook).

Fornirò una breve panoramica di cosa si può fare per il codice non nativo. Per quanto ne so, ci sono 3 opzioni di lavoro. Questa è la generazione di bytecode per Java e la generazione di bytecode per .Net: Quercus, Project Zero, Phalanger. Non prenderò in considerazione la compilazione in codice non nativo, perché non lo usiamo. Torniamo alla compilazione in codice nativo.

Secondo me il compilatore più vecchio è Roadsend. Ha iniziato a essere sviluppato molto tempo fa, nel 2002. Originariamente era un'applicazione commerciale. È stato chiuso, solo nel 2007 è stato rilasciato in Open Source. Esiste uno schema di compilazione molto complesso: per il linguaggio Scheme viene utilizzato un certo compilatore Bigloo, dopodiché viene generato il codice nativo. Questo compilatore non utilizza Zend Engine.

Possiamo generare un file binario eseguibile separato o generare un modulo per Apache. È anche possibile generare un file binario che funzionerà come server web. Ma non funziona. Non so perché, ma a me non funziona affatto.

Per quanto ne so, i lavori su Roadsend non sono attualmente in corso. Si è evoluto nel progetto Raven, che è stato completamente riscritto in C++. Come compilatore, utilizza LLVM per generare codice.

Al momento tutto sembra molto promettente.

Ma è ancora in costruzione. Anche nella documentazione ci sono accenni al fatto che non genereremo file binari. Aspettare.

Le cose sarebbero tristi se non avessimo la PHC. Questo è un compilatore OpenSource. È stato sviluppato dal 2005. Uno dei suoi svantaggi: utilizza SAPI integrato. Non stiamo abbandonando la macchina Java, lo Zend Engine. Essenzialmente, traduce il codice PHP nel codice del modulo di estensione PHP. Successivamente viene compilato, ma il processo di esecuzione coinvolge ancora una volta Zend Engine.

Esempio di utilizzo del PHC

Molto simile a come lavoriamo, ad esempio, con i compilatori convenzionali, gcc. Il primo mostra che esiste un binario, possiamo anche semplicemente generare il codice C. Poiché all'interno viene utilizzato lo stesso gcc dopo aver generato questo codice, possiamo utilizzare i flag destinati all'ottimizzazione e altre cose.

Stavamo parlando di un'applicazione che viene eseguita dalla riga di comando.

Per avviare un'applicazione web è necessario eseguire diversi passaggi, è piuttosto complesso. Per prima cosa devi generare un'estensione, quindi compilare il codice e quindi collegarlo in qualche modo (dinamicamente o staticamente).

Principali vantaggi dell'assistenza sanitaria primaria

Essenzialmente utilizziamo lo stesso PHP e siamo pienamente compatibili. Tutte le altre estensioni sono supportate. Usiamo tutto ciò che abbiamo compilato. Documentazione abbastanza buona.

A proposito, uno dei bonus aggiuntivi di PHC è che puoi generare il lavoro XML del nostro script in base a come è costruito XML, a volte questo può essere utile.

Aspetti negativi

Secondo me, questo è un binario inferiore, perché ha ancora una dipendenza da Zend Engine. C'è anche una certa complessità in termini di connessione di progetti web.

La stessa cosa

Questa segnalazione probabilmente non sarebbe avvenuta se non fosse apparso HipHop, una soluzione di Facebook. I suoi creatori hanno anche accumulato una grande quantità di codice PHP e hanno pensato a lungo a cosa farne.

A quanto ho capito, dopo che le opzioni per riscrivere tutto sono state rifiutate, si è deciso di scrivere una sorta di traduttore (in questo caso in codice C++). Il progetto è relativamente giovane; è stato ufficialmente rilasciato solo nel febbraio di quest'anno. Il codice PHP viene tradotto in codice C++ e quindi generato utilizzando gli strumenti standard del tuo sistema operativo. Tuttavia, per ora è supportato solo il sistema operativo Linux.

Proprio ieri ho chiesto a un rappresentante di Facebook informazioni su questa decisione. Ha detto che attualmente il 100% del codice PHP è compilato tramite HipHop. Il codice non funziona nella sua forma pura tramite l'interprete PHP. Ancora una volta, i creatori hanno annunciato una significativa riduzione del carico del processore.

Funzionalità di base dell'HipHop

Genera direttamente il binario stesso, che può essere eseguito dalla riga di comando. Esiste un'opzione per avviarlo come server Web di streaming. C'è anche un debugger integrato separato. Può eseguire il debug degli script sia localmente che in remoto (funzionerà come server).

Il processo di assemblaggio non è affatto banale. C'è una descrizione, ma non è raccolta ovunque. Al momento, come ho detto, è tutto assemblato per Linux, inoltre inizialmente tutto era “su misura” per 64 bit. Sebbene 32 bit siano ora supportati sperimentalmente. Ma sono riuscito ad assemblarlo e ad aggiustarlo un po' - in generale, ha fatto tutto questo, perché non è assemblato per impostazione predefinita.

Inoltre, hanno le proprie versioni di libcore e, secondo me, ci sono anche un paio di librerie che necessitano di patch. In generale, il processo di assemblaggio non è così semplice.

All'uscita dopo l'assemblaggio, riceviamo un determinato file hpp, che è un traduttore del nostro codice PHP in C++. Se guardiamo le bandiere, ce ne sono parecchie. Ne ho evidenziati qui alcuni fondamentali di cui potresti aver bisogno.

Possiamo utilizzare un file in formato HDF come file di configurazione (config), specificando varie direttive. Lì possiamo impostare il livello di errore e altre cose (HDF è tutto ciò che è disponibile in forma strutturata). Possiamo anche prendere la configurazione stessa dal database o usarla direttamente sulla riga di comando.

Impostiamo il livello di registrazione durante la compilazione: mostriamo tutti gli errori o visualizziamo anche avvisi, informazioni aggiuntive o in generale teniamo un registro completo di tutto ciò che accade.

Una direttiva molto utile è input_list=FILE, che ci permette di specificare un elenco di script che vogliamo compilare. Vale anche la pena menzionare una direttiva come lazy-bind. Possiamo specificare tutti i file di progetto, quelli che verranno compilati.

Esempio di esecuzione della compilazione di script PHP

È stato installato il terzo livello di registrazione, ci sono informazioni abbastanza generali sul tempo, puoi vedere quanto tempo ci è voluto. In effetti, la sceneggiatura è abbastanza semplice. Questo è il solito "Hello, World", ho appena fatto uno screenshot.

Il file più pesante è il nostro binario "programma", la sua dimensione è di 28 MB. In sostanza, il nostro "Hello, World" pesa 28 MB. Volevo sottolineare che oltre alla riga standard "Echo "Hello, World!", questo binario include molto altro: si tratta di un server Web a tutti gli effetti, un server a tutti gli effetti per l'amministrazione.

Che cosa stiamo facendo?

Abbiamo "Hello…" in C++, che esegue una funzione composta da una riga "echo "Hello, World". Inoltre, vengono caricate molte cose di terze parti. Come possiamo vedere, questo è un file a tutti gli effetti nel C++.

Questo è il programma risultante. Contiene già diversi tasti diversi per diverse configurazioni, ma ne citerò solo alcuni.

Questo è --mode, questa è la modalità di lancio del nostro programma. Possiamo eseguirlo direttamente (dalla riga di comando) o in modalità server web o demone completo. Ci sono un paio di altre opzioni, ma non sono importanti.

config viene utilizzato nello stesso formato. Non ho dato direttive perché ce ne sono tante. HipHop viene fornito con la documentazione. Non è sul sito wiki, ma con la distribuzione viene fornita la documentazione, dove tutto è chiaramente descritto. Non mi aspettavo nemmeno che la descrizione fosse così dettagliata e questo ti consente di configurare la soluzione in modo abbastanza flessibile.

Per eseguire in modalità server, possiamo specificare la porta. Per l'amministrazione viene utilizzata una porta separata, dove è possibile inviare alcune richieste che consentono di gestire il server. Se abbiamo un server di debug in esecuzione, indichiamo l'host e la porta a cui ci “collegheremo” per il debug.

Esempio di lancio

Ad esempio, per la trasmissione abbiamo specificato la porta 9999. Eseguendo semplici richieste http, possiamo ricevere statistiche, oppure gestire in qualche modo il server, o ottenere alcune informazioni aggiuntive. In generale, è molto conveniente.

Opzione per ottenere informazioni sullo stato

E' possibile ricevere lo stato del server impostato in vari formati built-in (xml, json, html). In sostanza, vengono fornite informazioni sul processo master del server stesso e sui gestori, ovvero i thread che elaborano le richieste.

Statistiche aggiuntive

In effetti, vengono fornite molte statistiche. Poiché HipHop funziona in modo nativo con memcache e SQL sotto forma di MySQL, fornisce informazioni dettagliate su tutte le operazioni eseguite con esso.

Statistiche complete sulla memoria

C'è una funzionalità molto utile qui: Statistiche dell'applicazione. Utilizzando le funzioni aggiuntive dello stesso HipHop in PHP, possiamo scrivere statistiche nei nostri script, che poi riceviamo attraverso l'accesso regolare a http.

Debug

Come ho già detto, è possibile utilizzare il "debug" integrato per eseguire il debug degli script. Questo è molto comodo perché l'interprete hppi funziona in modo simile a quello che abbiamo compilato. C'è una differenza nel "comportamento" degli script quando vengono eseguiti in PHP standard e quando utilizzano alcuni dati compilati. Per eseguire il debug di ciò che è stato compilato, Facebook ha scritto un interprete separato.

Nel primo caso eseguiamo il codice con lo switch “-f” e vediamo come si comporta il file; tutto l'output va a stdout. Oppure possiamo eseguirlo in modalità debug ed entrare nel debugger interattivo. È molto simile al GDB standard: puoi anche impostare punti di interruzione, eseguire, inserire valori variabili, tracciare e altro.

Una delle funzionalità aggiuntive

Abbiamo un programma che si è rivelato dopo la compilazione. Può essere utilizzato come server RPC. Eseguiamo richieste su http e, chiamando la funzione params, possiamo passare un parametro come array json o come parametro separato. Avremo restituito json, che restituisce i risultati di queste funzioni. Questo è molto comodo: la funzionalità necessaria è già integrata fin dall'inizio.

Contro dell'HipHop

Al momento, HipHop non supporta costrutti e funzioni del linguaggio come eval(), create_function() e preg_replace() con /e, sebbene siano tutte analoghe a eval(). Tuttavia, nelle ultime versioni, secondo me, puoi ancora abilitare eval() tramite config. Ma non è consigliabile farlo. In generale, usare eval() è sbagliato.

I principali vantaggi dell'HipHop

Naturalmente, il vantaggio principale è il supporto di Facebook. Funziona e viene sviluppato abbastanza attivamente. Intorno a questo progetto sta emergendo una comunità di sviluppatori. È stata scritta un'implementazione PHP completamente nuova.

Come ho già detto, il vantaggio è che viene generato codice nativo. Si sostiene un aumento delle prestazioni riducendo i costi di carico del processore (i test lo confermano).

È abbastanza flessibile nella configurazione. Sono rimasto piacevolmente sorpreso dal fatto che ci siano alcune opzioni di personalizzazione. Penso che ciò sia dovuto al fatto che il progetto funziona davvero. Tutto ciò che viene utilizzato viene incrementato.

Come ho già detto, HipHop offre molte funzionalità aggiuntive. Questi includono l'utilizzo come server RPC, amministrazione, varie statistiche e molto altro. A proposito, esiste anche un'API per lavorare con altre lingue.

Per questa soluzione è stata scritta una documentazione abbastanza buona. Un altro vantaggio: si tratta di una soluzione effettivamente pronta per l'uso in produzione (esempio: Facebook).

Aspetti negativi

Lo svantaggio principale è che al momento è supportato un numero piuttosto limitato di moduli. Ad esempio, quando lavoriamo con un database, possiamo utilizzare solo funzioni per lavorare con MySQL. Non c'è supporto PostgreSQL qui.

Esiste anche la complessità dell'assemblaggio, di cui ho già parlato. Ci sono problemi con la creazione su sistemi a 32 bit. Ma penso che questo verrà risolto presto. Per ora viene utilizzata solo la compilazione da PHP 5.2. La versione 5.3 non è ancora supportata, ma lo sarà come promesso.

Cosa non dovresti aspettarti dalla compilation in generale e dall'HipHop in particolare?

La compilazione non accelererà in alcun modo le lente query SQL nel database. Se il collo di bottiglia è il database, compilarlo o non compilarlo, non servirà a nulla.

La compilazione non accelera il caricamento statico, ma solo il caricamento dinamico. Rende il debug molto più difficile. Molte persone sono probabilmente abituate al fatto che tutto sia abbastanza semplice da eseguire il debug in PHP. Ciò non accadrà più durante la compilazione. Sebbene, come ho notato, Facebook abbia reso questo processo il più semplice possibile, senza di esso sarebbe ancora più difficile compilarlo ogni volta.

Non aspettarti che questa sia una sorta di “proiettile d'argento” che risolverà tutti i tuoi problemi. In effetti, la compilazione risolve una gamma piuttosto ristretta di problemi. Se lo sono, allora questo può aiutare.

Quali problemi risolve la compilazione?

Riduce il carico sulla CPU, poiché quando si lavora attivamente con PHP e un gran numero di richieste, il carico su di essa aumenta in modo abbastanza significativo. Naturalmente, mi piacerebbe fare alcuni test.

Test

Il primo test (il più semplice) è un'operazione piuttosto costosa che richiede parecchio tempo per essere completata. Nei test ho cercato di astrarmi e di non fare richieste utilizzando qualche risorsa esterna.

Il carico ricade interamente sul processore. Il test ha dimostrato che HipHop "ha vinto" contro tutti: funziona quasi una volta e mezza più velocemente del compilatore PHP standard. PHC ha superato questo test molto lentamente.

Per il secondo test delle prestazioni ho utilizzato lo script PHP ufficiale, scaricabile da SVN. Esegue una serie di funzioni che eseguono l'ordinamento, l'assegnazione, la somma: operazioni piuttosto costose da un punto di vista matematico.

L'HipHop era di nuovo avanti. Inoltre con PHP standard la differenza oraria è di circa 3 volte. PHC si è comportato meglio qui, ma era circa la metà peggiore dell'HipHop.

PHP viene utilizzato principalmente per i thread che gestiscono le richieste http: vale la pena tenerlo a mente.

Diverse configurazioni standard (Apache con PHP, Nginx con fpm-php e plug-in APC per il caching del codice). Come quinta opzione: HipHop.

Ad essere sincero, i test non li ho condotti sul server, ma su un laptop. I numeri, ovviamente, potrebbero non corrispondere del tutto alla realtà, ma in questo caso i risultati sono normali. Vale la pena notare che all'aumentare del carico, aumenta contemporaneamente il numero di richieste e il numero totale di richieste. Il prossimo è RPS. Abbiamo testato una pagina standard che include 10 inclusioni semplici. Essenzialmente, si tratta di testare PHP come interprete.

Domanda del pubblico: Quali sono i numeri nella cella: secondi?

Alexey Romanenko: Questo è fps.

Qui possiamo concludere che all'aumentare del numero di richieste simultanee, HipHop si comporta molto bene.

Si può vedere che l'utilizzo di APC è una pratica standard. Ciò dimostra che aggiunge, ad esempio, come Apache un incremento di prestazioni di circa 2 volte. Questo succede anche con Nginx. Ma il fatto che Nginx sia lento non significa che questo pacchetto sia peggiore. Solo un test specifico. Se testiamo davvero qui, Apache “morirà” in caso di richieste lente.

Probabilmente vogliamo capire se ne abbiamo bisogno o meno.

Quando dovresti pensare alla compilazione?

Molto probabilmente, questo è necessario quando vediamo che il nostro collo di bottiglia è la CPU. Se siamo vincolati alla CPU e utilizziamo PHP come interprete standard, probabilmente vale la pena considerare che forse parte del progetto può essere compilato.

Per alcuni casi in cui l'applicazione necessita di autonomia per essere eseguita, è improbabile che questo metodo sia adatto.

Ridurre il numero di server. Quando ci sono molti server, riducendo la produttività di 2 volte, grosso modo, riduciamo anche il numero della metà. Quando si tratta di un server, non ha senso, ma quando ce ne sono 100-200, probabilmente ha senso.

Il motivo principale per cui Facebook ha iniziato a utilizzare HipHop è la presenza di grandi volumi di codice PHP che non c'è modo di riscrivere (o non c'è nessuno, o è semplicemente costoso). Aumentare la produttività di 2 volte è già positivo.

Probabilmente tutto. In attesa di domande.

Domande e risposte

Domanda del pubblico: Ciao. Per favore dimmi se hai altri esempi di implementazioni di successo di Hiphop, oltre a Facebook. Vorresti trasferire il sito web RBC, ad esempio, su HipHop? Alexey Romanenko: Inizierò con il secondo. Il sito web della RBC è difficile da tradurre. Per quanto riguarda l'implementazione di successo. Ho compilato PHP Unit da solo, è stato compilato con successo. Inoltre, per quanto ne so, la scheda PHP Bunty viene compilata correttamente. Numerose organizzazioni, infatti, utilizzano già la compilazione. Ulteriori test dimostreranno quanto sarà giustificato l'utilizzo di questo progetto. Domanda del pubblico: Puoi fare un esempio di un'organizzazione che lo utilizza? Alexey Romanenko: Onestamente non te lo dirò adesso, ma questo è l’Occidente. Per quanto ne so, qui non lo usa nessuno. Domanda del pubblico: Qual è la differenza in fase di esecuzione oltre alla mancanza di supporto per alcune delle funzionalità che hai menzionato. Quanto è pericoloso tradurre un progetto “live”? Alexey Romanenko: La differenza è che qualsiasi programma compilato può bloccarsi. Forse appariranno alcuni problemi che non sono stati ancora identificati. In effetti, ci sono una serie di differenze nel "comportamento" del PHP stesso. Non li ho inclusi perché informazioni più dettagliate possono essere trovate nella documentazione. Il team di Facebook ha scritto il proprio interprete, che è essenzialmente equivalente al 99,9% a quello che funzionerà in forma compilata. È meglio testare il tuo codice non con un interprete PHP standard, ma, come ho detto, con hppi per PHP.