PHP è un linguaggio interpretato: prima di eseguire un file lo legge, lo analizza e lo traduce in istruzioni interne, gli opcode. Senza cache questo lavoro viene rifatto a ogni richiesta, per ciascuno dei file caricati. La documentazione di PHP riassume così il ruolo di OPcache: conserva il bytecode precompilato degli script in memoria condivisa, evitando a PHP di caricare e analizzare gli script a ogni richiesta.
Come funziona OPcache
OPcache è un’estensione distribuita con PHP, caricata dalla direttiva zend_extension. Alla prima esecuzione di un file, i suoi opcode vengono messi in memoria condivisa. Le richieste successive li riutilizzano direttamente, qualunque sia il worker PHP-FPM che le gestisce, perché la memoria è comune ai processi di uno stesso master.

Per tenere conto delle modifiche, OPcache controlla per impostazione predefinita la data dei file ogni due secondi (opcache.revalidate_freq=2). Se disattivi questo controllo (opcache.validate_timestamps=0), un possibile guadagno in produzione, le modifiche ai file non vengono più viste finché la cache non viene svuotata con opcache_reset() o con un riavvio di PHP.
Le impostazioni utili
Valori predefiniti documentati da PHP:
opcache.memory_consumption: 128 MB di memoria condivisa;opcache.max_accelerated_files: al massimo 10.000 file;opcache.interned_strings_buffer: 8 MB per le stringhe internate;opcache.revalidate_freq: 2 secondi.
Un WordPress con un page builder, WooCommerce e una ventina di plugin può superare il numero di file o la memoria previsti. Oltre quella soglia una parte degli script non viene più messa in cache e il vantaggio si riduce. La funzione opcache_get_status() o un plugin di diagnostica mostra il livello di riempimento.
Da PHP 7.4 il preloading (opcache.preload) carica alcuni file all’avvio di PHP. Non è disponibile su Windows e richiede un riavvio per essere aggiornato: è più adatto ad applicazioni stabili che a un WordPress aggiornato spesso.
Per WordPress
La documentazione di WordPress raccomanda di aggiungere una cache degli opcode come OPcache per migliorare nettamente le prestazioni di PHP. Completa, senza sostituirle, la cache delle pagine e la cache degli oggetti: OPcache evita la compilazione del codice, la cache degli oggetti evita query al database, la cache delle pagine evita di eseguire PHP.
- Su un hosting condiviso OPcache è di norma attivo; verificalo con phpinfo() o nelle impostazioni PHP del tuo pannello.
- Su un VPS, adatta la memoria e il numero di file alla dimensione reale dei tuoi siti.
- Quando cambi versione di PHP, ricarica PHP-FPM per ripartire da una cache pulita; è anche il momento di controllare che il ramo scelto sia ancora supportato (vedi le versioni di PHP a fine vita).
Sicurezza
Su un server condiviso la cache è comune ai pool di uno stesso master PHP-FPM. Direttive come opcache.validate_permission e opcache.validate_root servono a verificare i permessi sui file in cache e a evitare collisioni negli ambienti chroot. La direttiva opcache.restrict_api limita l’uso delle funzioni di OPcache a un percorso specifico, per evitare che uno script qualsiasi svuoti la cache. Queste impostazioni completano quelle della nostra guida per mettere in sicurezza PHP.
Errori frequenti
Disattivare validate_timestamps e poi non capire perché la modifica a un file non compare; lasciare la memoria predefinita su un sito grande; credere che OPcache sostituisca una cache delle pagine.