Cos’è OPCACHE
Una delle maggiori criticità riguardo i siti web è il tempo di caricamento. Uno dei modi migliori per ridurre il tempo di caricamento è abilitare sistemi di cache. Non esiste solo la cache di file HTML, OpCache infatti è una cache di opcode, che aumenta la velocità dei siti Web PHP memorizzando script precompilati bytecode nella memoria condivisa.
Mettere in cache gli script PHP significa che, la prima volta che lo script viene eseguito viene anche precompilato e salvato in memoria. Tutte le volte successive che lo script verrà richiamato non sarà necessario eseguirlo di nuovo dato che opcache ha memorizzato il codice risultante nella memoria RAM. Questo risparmio ti tempo porta miglioramenti delle prestazioni, soprattutto su siti web costantemente sotto stress.
La definizione ufficiale dice:
OPCache migliora le performance PHP immagazzinando uno script bytecode precompilato nella memoria condivisa, eliminando così la necessità per il PHP di caricare e analizzare gli script per ogni richiesta.
In altre parole, quando uno script PHP viene eseguito, è compilato in opcode, un codice comprensibile dalla macchina. OPCache immagazzina questo codice in memoria durante la prima esecuzione in modo che sia riutilizzato in seguito. La cache PHP porta così a incrementi di performance. OPCache rimpiazza APC ed è un’alternativa a XCache, un acceleratore PHP. A differenza di Memcached che lavora sul database, Opcache lavora sugli script PHP.
Questa estensione è in bundle con PHP 5.5.0 e versioni successive, ed è disponibile in PECL per le versioni di PHP 5.2, 5.3 e 5.4.
Fondamentalmente quando il sistema compila del codice in PHP, il codice leggibile dall’uomo viene convertito in linguaggio macchina e ci vuole tempo per compilare tutti gli script. Quindi se l’applicazione fa molte richieste ciclicamente, le prestazioni potrebbero essere migliorate mettendo in cache i vari script. Abilitando PHP OPcache, il processo verrà eseguito una volta e memorizzerà nella cache tutti gli script. Gli script verranno archiviati in memoria e solo gli aggiornamenti verranno compilati e continueranno a essere archiviati.
OPCACHE può darti un notevole incremento delle prestazioni e può ridurre significativamente il tempo di caricamento del sito web. PHP7 OPcache utilizza 64 MB di memoria per impostazione predefinita. Non sono necessarie librerie esterne per abilitare questa estensione.
Come funziona OPCACHE
Di seguito l’immagine del funzionamento di PHP7 OPcache.
Ogni volta che lo script viene richiamato, il processo controlla la cache OPcode di PHP e cerca il codice già compilato nella memoria condivisa. Se il codice non viene trovato, avvia automaticamente la compilazione e la salva nella memoria.
Perché conviene attivare OPCACHE
Consideriamo un caso in cui si dispone di un sito Web di piccole dimensioni con il traffico normale, ad esempio 500-5k di visitatori al giorno. Gli utenti attivi simultaneamente sono relativamente pochi, 5-10 in media. In questo caso difficilmente si hanno problemi di sovraccarico e di prestazioni, gli utenti non noteranno rallentamenti.
Altro caso sarebbe un sito Web o un’applicazione con centinaia di migliaia di visitatori al secondo. Qui PHP7 OPcache può dare forte aiuto in termini di prestazioni, in quanto riduce drasticamente il carico del server e con pochi passaggi di configurazione vedrai miglioramenti seri in termini di velocità e prestazioni.
OPcache da solo non può essere la soluzione a tutti i tuoi problemi di performance. Anche le impostazioni e la configurazione del server hanno un ruolo importante per massimizzare le prestazioni. Facendo un esempio pratico, un server con 1GB di RAM e 1 CPU ospitato su Digitalocean, può gestire circa 10 richieste al secondo. Abilitando il sistema OPcache PHP il numero aumenta tranquillamente a 34+ richieste al secondo.
Come si installa OPCACHE
OPcache è presente di default su tutte le versioni PHP5.5 e successive. Tuttavia, in certi casi potrebbe essere disabilitato, ogni hosting provider ha le sue policy. Per iniziare a utilizzare OPcache in PHP5.5 + devi prima abilitarlo manualmente attraverso il file di configurazione php.ini.
Come configurare OPCACHE
Il file di configurazione si chiama php.ini e la sua posizione cambia in base al sistema operativo e web server installato, alcune possibilità sono:
- Apache: /etc/php5/apache2/php.ini
- Nginx PHP-FPM: /etc/php5/fpm/php.ini
- Nginx PHP-FPM: /etc/php/7.0/fpm/php.ini
Per abilitare OPcache cerca e cambia la seguente linea come indicato:
;opcache.enable=0
Cambia in:
opcache.enable=1
La modifica toglie la punteggiatura iniziale per abilitare la riga di codice e cambia il valore da “0” a “1” per attivare il comando. Nel linguaggio di programmazione 0 significa spento, 1 significa acceso.
Di seguito ti indico la configurazione ideale per un server con 4 GB RAM e 2 vCPUs.
...
[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=240
opcache.fast_shutdown=1
...
Modifica la quantità di RAM utilizzata da OPcache
Con OPcache devi trovare un compromesso tra la velocità e la quantità di RAM utilizzata. Maggiore è la quantità di RAM che si è disposti a dedicare alla memorizzazione dell’opcode, maggiore è l’opcode che può essere memorizzato. Non è detto che aumentando il valore le cose migliorino per forza, ad un certo punto il rendimento cala perché alcuni codici vengono eseguiti raramente, oppure il tuo codice potrebbe non essere così grande da occupare tutta la memoria dedicata.
Vale la pena giocare con questa impostazione per vedere dove si ottiene il migliore compromesso tra prestazioni e RAM. Questa impostazione è definita in megabyte.
; opcache.memory_consumption = 64
Cambia in:
opcache.memory_consumption = 128
Aumenta il numero di script che possono essere memorizzati nella cache
Nelle impostazioni di OPcache possiamo anche definire il numero di script che vengono memorizzati nella cache. Il valore minimo è 200 ed il valore massimo è 10.000.
; opcache.max_accelerated_files = 2000
Cambia in:
opcache.max_accelerated_files = 4000
Anche in questo caso devi verificare quanti script vengono effettivamente usati dal tuo sistema, non serve alzare il valore e basta. Procedi con la guida per sapere come controllare questi valori.
Modifica la frequenza di riconvalida
Per assicurarti che l’OPcache noti quando cambi il tuo codice PHP, puoi impostare la frequenza di rinnovo. Fondamentalmente, questo comando dirà alla cache quanto spesso controllare il timestamp sui file PHP. Il valore è misurato in secondi.
; opcache_revalidate_freq = 2
Cambia in:
opcache_revalidate_freq = 240
Se i tuoi script PHP non cambiano mai puoi valutare valori più lunghi in modo da stressare di meno il server.
Verificare che PHP OPcache Mod sia abilitato
Assicurati che OPcache sia abilitato. Con PHP 5 digita nella shell questo comando.
# PHP 5.x:
sudo php5enmod opcache
# PHP 7.x:
sudo phpenmod opcache
Ora riavvia PHP.
- sudo service php7.0-fpm restart
Hai solo bisogno di riavviare il tuo web server per attivare OPCACHE.
- Server Web Apache: sudo service apache2 restart
- Nginx Web-Server: sudo service nginx restart
Con versioni successive di PHP puoi testare OPCACHE con il comando phpinfo(). Dovresti essere pronto per iniziare a utilizzare OPcache di PHP.
Verificare lo stato di OPCACHE
Il modo tradizionale per verificare se la cache PHP di OPcode è in esecuzione sul server è scrivere phpinfo(); in un file php e vedere lo stato.
Ecco un estratto del file con phpinfo():
Se vuoi vedere la GUI – interfaccia grafica con cui gestire report ed impostazioni, puoi utilizzare i pacchetti open source disponibili su Github:
- https://github.com/PeeHaa/OpCacheGUI
- https://github.com/rlerdorf/opcache-status
- https://github.com/amnuts/opcache-gui
Con queste semplici GUI puoi monitorare la memoria usata in tempo reale, il numero di script in memoria ed eliminare la cache di singoli script. Installare queste GUI è semplice, due di quelle indicate infatti richiedono solo di creare un file nel web server.
Verificare le performance
Attendi qualche giorno dopo aver attivato OPCache poi controlla il report crawl in Google Search Console. Dovresti notare un calo del tempo medio di download delle risorse, questo significa che Googlebot potrà scansionare più pagine nello stesso arco di tempo rispetto al server senza OPCache.
A questo punto spero che, leggendo questa guida, tu sia convinto ad attivare PHP OPcache nel tuo web server. Il caching del codice è una grande idea che permette di non compilare il codice più e più volte dato che il codice viene compilato solo quando viene aggiornato e quindi salvato nella memoria condivisa. OPCACHE consente di risparmiare tempo e offre un incremento sensibile delle prestazioni.
Se hai ulteriori domande su OPcode in PHP o su questo articolo, puoi scrivere i tuoi commenti qui sotto.