Addio all’hosting parte 4 – Ottimizzazione

PHP ha questo fastidioso problema che è stato concepito come se la RAM e la compilazione fossero il peccato originale.

Ne consegue che, con l’approccio di base, quando chiedete una pagina il povero webserver lancia PHP indicandogli la pagina richiesta, questo si legge lo script, processa tutti i file da includere, in modo ricorsivo, e quando ha finalmente lo script completo, lo trasforma in codice eseguibile (a.k.a. lo compila just in time) e come ultima cosa lo esegue. La cosa è immensamente inefficiente se deve essere fatta ogni volta che viene richiamata una pagina. Sarebbe bello delegare ad altri il linking e la compilazione per lasciare al sever solo l’esecuzione ma questo è molto complesso da fare con PHP (anche se qualcuno lo ha fatto) percui ho scelto l’approccio più tradizionale della cache.

Ci sono due moduli che possono venirci in aiuto APCu e OPCache.

Il concetto di base è di non rieleggere (e possibilmente non ricompilare) file messi in cache.
OPCache in particolar modo memorizzare il bytecode risultante dalla compilazione delle pagine in memoria e quindi raggiunge l’obbiettivo dell’efficienza. Su un server di produzione con aggiornamenti poco frequenti si possono calibrare le impostazioni per ricompilare il meno possibile.

La mia configurazione di OPCache assomiglia a questa :

zend_extension=/usr/lib64/php/modules/opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=120
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist

In particolar modo la frequenza di rivalidazione a 2 minuti mi è sembrata ragionevole ma può essere ulteriormente aumentata. Il valore è in secondi, più sale e più aumentano gli hit della cache, ma aumenta anche il tempo che passa tra quando una modifica viene caricata sul server quando effettivamente diventa visibile.

OPCache è incluso di default a partire da PHP 5.5, ma nella mia installazione ho ancora PHP 5.4 quindi è necessario installarlo separatamente.

Come risultato ho un Time to first byte per wordpress di 0,4s e download dell’html in 0.6s. In hosting (dove immagino ci siano persone che pensano molto come ottimizzare i server in quanto ottimizzazione uguale minor costi) 0,45s e 0,8s

Con phpBB il Time to first byte scende addirittura a 0,13s e html completo in 0,52s .