5 Modi per aumentare le prestazioni di PHP-Tideways

5 Modi per aumentare le prestazioni PHP

BONUS: Abbiamo discusso questo argomento con un esperto della comunità PHP nel nostro podcast:

Fuori dalla proverbiale, scatola, PHP fornisce prestazioni decenti. Tuttavia, ci sono diverse cose che noi, come sviluppatori PHP e amministratori di sistema, possiamo fare per aumentare ulteriormente le sue prestazioni; a volte per quasi nessuno sforzo.

In questo post, ho intenzione di passo attraverso cinque di questi modi. Quando hai finito di leggere, dovresti vedere almeno un notevole aumento delle prestazioni della tua applicazione PHP. Cominciamo.

Usa PHP 7

Uno dei modi migliori per migliorare le prestazioni di PHP è eseguire l’ultima versione (PHP 7). Offre un significativo miglioramento della velocità rispetto a qualsiasi versione precedente. Ora, i risultati saranno sempre variare, come non ci sono due applicazioni sono sempre gli stessi. Tuttavia, sulla base di rapporti di una serie di diversi sviluppatori e società di hosting di rilievo, i miglioramenti delle prestazioni sono significativi.

Ecco un piccolo esempio:

  • I benchmark PHP ufficiali riportano che PHP 7 può eseguire il doppio delle richieste al secondo rispetto a PHP 5.6.
  • I benchmark delle prestazioni PHP di Kinsta mostrano che WordPress 5.0 può eseguire 3 volte più transazioni di PHP 5.6; e
  • Pantheon ha riferito che PHP 7 ha dato un miglioramento del 64% rispetto alla versione 5.3.

Se questo non è abbastanza per te, controlla i tuoi benchmark e vedi cosa dicono.

Inoltre, PHP 7.0.0 è stato rilasciato il 3 dicembre 2015 e l’ultima versione stabile, 7.3.6, è stata rilasciata il 30 maggio di quest’anno.

Inoltre, la versione finale di PHP 5, 5.6, è stata EOL (End of Life) 7 mesi fa, il 31 dicembre 2018. Quindi, se non l’hai già fatto, è ben passato il momento in cui hai fatto la transizione a PHP 7. Effettua l’aggiornamento e, come ha detto Rasmus a phpCE 2018, diventa verde(er) riducendo i costi di hosting.

Disinstalla Xdebug

La prossima cosa da verificare è che Xdebug non è installato sui server di produzione. Certo, Xdebug è uno dei profiler e debugger più sofisticati e completi per PHP, ma non dovrebbe mai essere abilitato (nemmeno installato) su un server di produzione, almeno fino a quando Xdebug 3 non viene rilasciato e dovresti unirti a noi nel supportare Derick per lavorarci.

Mentre i benchmark delle prestazioni variano (lo fanno sempre), un rapporto su Stack Overflow ha mostrato un aumento delle prestazioni del 50% rimuovendo completamente Xdebug. Inoltre, è importante notare che anche se Xdebug è stato installato sul server, non è stato nemmeno abilitato!

Xdebug performance benchmark Xdebug performance benchmark

Per verificare se è installato, eseguire php -m | grep -i xdebug o controllare il pannello di amministrazione del provider di hosting. E se vuoi sapere di più su come funziona Xdebug, controlla la documentazione di Xdebug.

Usa Composer Optimize Autoloader

Anche se probabilmente abbiamo molta familiarità con l’uso di Composer per gestire la gestione dei pacchetti, se non consideriamo l’ottimizzazione della configurazione che genera, le nostre applicazioni non funzioneranno nel miglior modo possibile.

Ecco una citazione dalla documentazione del compositore che spiega perché:

a causa del modo in cui sono impostate le regole di caricamento automatico PSR-4 e PSR-0, it Composer deve controllare il filesystem prima di risolvere definitivamente un nome di classe. Questo rallenta un po ‘ le cose, ma è conveniente negli ambienti di sviluppo perché quando si aggiunge una nuova classe, può essere immediatamente scoperta/utilizzata senza dover ricostruire la configurazione dell’autoloader.

Per migliorare le prestazioni, Composer offre tre livelli di ottimizzazione; questi sono:

  • Generazione di mappe di classe
  • Mappe di classe autorevoli
  • Cache APCu

1: Generazione di mappe di classe

Questa strategia converte le regole PSR-4/PSR-0 in regole classmap. Questa strategia è più rapida perché classmap può restituire istantaneamente il percorso completo ai file noti ed evita un’operazione stat del filesystem.

Per abilitare questo livello di ottimizzazione, eseguire il seguente comando:

composer dump-autoload --optimize 

2/A: Mappe di classe autorevoli

Oltre ad abilitare automaticamente il livello 1, quando si utilizza questo livello, se una classe non viene trovata nella classmap generata, l’autoloader non tenterà di cercare sul filesystem in base alle regole PSR-4. Per abilitare questo livello di ottimizzazione, eseguire il seguente comando:

composer dump-autoload --classmap-authoritative 

2/B: Cache APCu

Questo livello aggiunge una cache APCu come fallback per la mappa delle classi. Tuttavia, non genera la classmap. Detto questo, il livello uno dovrebbe essere abilitato manualmente. Per abilitare questo livello di ottimizzazione, eseguire il seguente comando:

composer dump-autoload --apcu 

Ci sono compromessi

Mentre ciascuno di questi livelli può migliorare le prestazioni dell’applicazione, ognuno di essi ha compromessi che devono essere compresi prima di essere utilizzati. Assicurati di consultare la documentazione del compositore prima di utilizzarli.

Usa un OPcache

Poiché PHP è un linguaggio interpretato, non compilato, il runtime PHP deve convertire il codice sorgente in codice byte eseguibile, prima che possa essere eseguito. E poiché PHP è un’architettura condivisa, questo processo deve avvenire su ogni richiesta.

Tuttavia, con una cache Opcode (OPcache), questo passaggio deve avvenire solo una volta per ogni file, poiché gli Opcode generati possono essere memorizzati nella cache nella memoria condivisa e referenziati lì.

Quindi, come puoi immaginare, un OPcache è uno dei modi meno intensi per migliorare le prestazioni di un’applicazione PHP, perché nessun codice deve cambiare. Alcuni rapporti mostrano un miglioramento della velocità del 70%.

Ci sono state diverse cache Opcode per PHP nel corso degli anni. OPCache (precedentemente Zend Cache) è stato fornito in bundle con PHP dalla versione 5.5 — ed è abilitato di default in PHP 7.

Per saperne di più, controlla la documentazione di OPcache. Per saperne di più sulle prestazioni tweaking OPcache, controlla l’eccellente articolo di Hayden James e il post di Tideway sulla messa a punto.

Utilizzare PHP 7 precarico

Se non avete sentito parlare di PHP 7.4 nuova funzione di precarico, ancora, è molto cool! In poche parole, la funzione prende la funzionalità Opcache più di quanto non sia mai andata prima.

Per ricapitolare rapidamente, la prima volta che viene rilevato un file sorgente PHP, deve essere analizzato, quindi compilato in bytecode dipendente dalla macchina, prima che il motore Zend possa eseguirlo. Gli opcaches riducono significativamente il sovraccarico di questo processo, poiché dopo la prima volta che il codice sorgente viene analizzato e compilato, i bytecode vengono quindi memorizzati in una cache Opcode nella memoria condivisa.

La prossima volta che viene rilevata una richiesta per quel file, PHP controlla se la cache dell’Opcode ha bytecode per il file. Se lo fa, vengono restituiti e utilizzati. In caso contrario (o se il file sorgente è cambiato da quando i bytecode sono stati compilati), il file sorgente viene analizzato, compilato e memorizzato nella cache. Questo dà un notevole incremento delle prestazioni a PHP.

Ora, diamo un’occhiata a come funziona il precarico. Per citare l’RFC di implementazione:

All’avvio del server – prima che venga eseguito qualsiasi codice dell’applicazione – possiamo caricare un determinato set di file PHP in memoria – e rendere il loro contenuto “permanentemente disponibile” per tutte le richieste successive che verranno servite da quel server. Tutte le funzioni e le classi definite in questi file saranno disponibili per le richieste immediatamente, esattamente come le entità interne. Il precarico assicura che:

  • Tutte le funzioni e la maggior parte delle classi, definite in questi file verranno caricate in modo permanente nelle tabelle delle funzioni e delle classi di PHP e diventeranno permanentemente disponibili nel contesto di qualsiasi richiesta futura.
  • PHP risolve le dipendenze di classe e i collegamenti con genitore, interfacce e tratti (qualcosa che non accade con il caching dell’Opcode).
  • PHP rimuove include inutili ed esegue altre ottimizzazioni.

Avendo il codice per un’intera applicazione, incluso il suo framework (come Zend Expressive, Symfony e Laravel) precaricato in memoria, codice che è cambiato solo al riavvio del server, la maggior parte delle applicazioni avrà prestazioni significativamente migliori.

Detto questo, il precarico ha alcuni, potenziali, inconvenienti che dovresti conoscere:

  • Un riavvio del server è necessario quando i file di origine cambiano.
  • Il precarico non funziona negli ambienti di hosting condiviso.
  • Il precarico non funziona quando ci sono più versioni della stessa applicazione.

Il precarico non è magico. Sia il codice che i processi di distribuzione dovranno essere refactoring per trarne vantaggio. Ad esempio, qualcuno dovrà sviluppare uno script loader personalizzato per determinare quali file caricare all’avvio del server e tale script dovrà essere eseguito all’avvio del server. Indipendentemente da ciò, è un miglioramento significativo, uno vale la pena investire in!

Usa un Profiler

Ora per un’opzione che richiederà un po ‘ più di lavoro rispetto a qualsiasi dei precedenti cinque. Spesso saltiamo dentro e cerchiamo di indovinare dove sono i colli di bottiglia delle prestazioni nelle nostre applicazioni, usando intuizione e ipotesi istruite.

Mentre questi possono funzionare, non sono gli approcci più efficienti. Invece, possiamo usare i profiler di codice per analizzare il nostro codice e mostrare dove sono i colli di bottiglia. In particolare, aiutano a rispondere a domande come le seguenti:

  • Quante volte è stato chiamato ogni metodo?
  • Qual è stato il tempo massimo di esecuzione di ciascun metodo?
  • Qual è stato il tempo medio di esecuzione di ciascun metodo?
  • Quante volte è stato incluso un file?
  • Quale percorso ha preso una richiesta attraverso un’applicazione (dal primo all’ultimo file di codice)?

Eseguendo il drill-down nei risultati di un profiler, puoi spesso essere piacevolmente sorpreso, anche se più probabilmente scioccato, di scoprire che la tua applicazione sta eseguendo percorsi di codice e classi che non ti aspettavi mai.

In base alle informazioni contenute nel rapporto profiler, tu e il tuo team potete quindi iniziare a capire meglio cosa sta facendo la vostra applicazione e fare refactoring informati per cambiarla, come e dove richiesto.

Se hai appena iniziato con la profilazione, ci sono diverse opzioni disponibili per PHP. I più comunemente usati sono:

  • Xdebug il profiler
  • Tideway del XHProf estensione (& XHGui)
  • spx Profiler
  • forp

In Conclusione

E questi sono i cinque modi per migliorare la qualità delle applicazioni PHP in particolare. Ognuno di loro per conto proprio vi consegnerà un notevole miglioramento delle prestazioni. Tuttavia, se usato insieme, dovresti aspettarti di vedere una prestazione significativa, per non parlare della qualità, del miglioramento.

Leave a Reply