2010-11-02 13 views
86

Lo so che può minify PHP, ma mi chiedo se non vi è alcun punto. PHP è un linguaggio interpretato, quindi funzionerà un po 'più lentamente di un linguaggio compilato. La mia domanda è: i client vedrebbero un miglioramento della velocità visibile nei carichi di pagina e tale se dovessi minimizzare il mio PHP?C'è un punto per minimizzare PHP?

Inoltre, c'è un modo per compilare PHP o qualcosa di simile?

risposta

141

PHP è compilato in bytecode, che viene quindi interpretato in base a qualcosa che assomiglia a una VM. Molti altri linguaggi di scripting seguono lo stesso processo generale, inclusi Perl e Ruby. Non è davvero un linguaggio interpretato tradizionale come, ad esempio, BASIC.

Non ci sarebbe alcun aumento effettivo della velocità se si tentasse di "minimizzare" la sorgente. Si otterrebbe un notevole aumento utilizzando uno bytecode cache like APC.

Facebook ha introdotto un compilatore denominato HipHop che trasforma il codice sorgente PHP in codice C++. Rasmus Lerdorf, uno dei grandi ragazzi di PHP, ha fatto un presentation for Digg earlier this year che copre i miglioramenti delle prestazioni forniti da HipHop. In breve, non è troppo più veloce dell'ottimizzazione del codice e dell'uso di una cache bytecode. HipHop è eccessivo per la maggior parte degli utenti.

Anche Facebook ha recentemente presentato HHVM, una nuova macchina virtuale basata sul proprio lavoro che rende HipHop. È ancora piuttosto nuovo e non è chiaro se fornirà un notevole incremento delle prestazioni al pubblico in generale.

Giusto per assicurarsi che sia dichiarato espressamente, si prega di leggere that presentation per intero. Indica numerosi metodi per confrontare e codificare il codice e identificare i colli di bottiglia utilizzando strumenti come xdebug e xhprof, anche da Facebook.

+1

Si noti che l'intera cosa bytecode/vm in realtà non ti compra nulla senza una cache bytecode esterna (!). Non capisco perché PHP continui a lanciare il bytecode di default ... – delnan

+0

Immagino che si tratti di un problema di hosting condiviso. APC è incluso in PHP per impostazione predefinita a partire dal vecchio trunk basato su 6.0. Non sono sicuro se lo vedremo per default in 5.4 o in qualsiasi modo il nuovo trunk finisca per essere chiamato ... – Charles

+0

Grazie mille per le informazioni. Sfortunatamente non ho un controllo approfondito del mio server (è in affitto). È probabile che gli host web utilizzino APC? – Bojangles

13

Rinuncia all'idea di minimizzare PHP in favore dell'utilizzo di una cache opcode, come PHP Accelerator o APC.

O qualcos'altro come memcached

+2

memcached non è una cache di codice operativo! – Javier

+12

Ho detto "qualcos'altro". – Stephen

+3

non è chiaro da che intendi qualcosa di diverso da una cache di opcode. – Treffynnon

3

Con alcuni riscrittura (i nomi delle variabili più brevi) si potrebbe risparmiare un paio di byte di memoria, ma che è anche raramente significativo.

Tuttavia, disegno alcune delle mie applicazioni in un modo che consente di concatenare gli script di inclusione insieme. Con php -w può essere notevolmente ridotto, aggiungendo un po 'di guadagno di velocità all'avvio dello script. Su un server abilitato per l'opcode, tuttavia, vengono salvati solo alcuni controlli mtime su file.

1

Esistono compilatori PHP ... vedere this previous question per un elenco; ma (a meno che tu non abbia la dimensione di Facebook o stia puntando la tua applicazione per eseguire client-side) sono generalmente molto più problematici di quanto valgano

Il semplice caching opcode ti darà più benefici per lo sforzo richiesto . Oppure profila il tuo codice per identificare i colli di bottiglia, quindi ottimizzalo.

3

Questa è una risposta meno di una pubblicità. Sto lavorando su un'estensione PHP che traduce gli opcode Zend per l'esecuzione su una VM con tipizzazione statica. Non accelera il codice PHP arbitrario. Ti permette di scrivere codice che funziona molto più velocemente di quanto permetta il normale PHP. La chiave qui è la digitazione statica. In una CPU moderna, un linguaggio dinamico consuma una penalità di malversazione del ramo sinistro e destro. Il fatto che gli array PHP siano tabelle hash impone anche costi elevati: molte errate previsioni delle filiali, uso inefficiente della cache, scarsa precaricolazione della memoria e nessun tipo di ottimizzazione SIMD. In particolare, il malinteso e le mancanze nella cache sono il tallone d'Achille per i processori di oggi.La mia piccola VM soppianta questi problemi usando tipi statici e array C al posto della tabella hash. Il risultato finisce per essere eseguito circa dieci volte più velocemente. Questo sta usando l'interpretazione bytecode. L'estensione può facoltativamente compilare una funzione tramite gcc. In tal caso, ottieni una velocità da due a cinque volte maggiore.

Ecco il link per chiunque sia interessato:

https://github.com/chung-leong/qb/wiki

Anche in questo caso, l'estensione non è un acceleratore generale PHP. Devi scrivere codice specifico per questo.

Problemi correlati