Senza opcache, PHP legge e compila ogni file a ogni richiesta: lo stesso lavoro, migliaia di volte al minuto, per file che non sono cambiati. opcache tiene in memoria la forma compilata. Di solito è il più grande miglioramento singolo disponibile, ed è una sola impostazione.
opcache.enable=1
opcache.memory_consumption=192
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=2
Controlli che sia davvero acceso
php -i | grep -E 'opcache.enable|opcache.memory'
# or, in a page you can reach:
print_r(opcache_get_status()['opcache_statistics']);
- opcache_hit_rate sotto il 95% - memory_consumption è troppo piccolo e sta buttando fuori file che gli serviranno di nuovo.
- num_cached_keys vicino a max_accelerated_files - alzi il limite dei file; un framework grande ha più file di quanti il valore predefinito ne consenta.
Che cosa NON fa
Mette in cache il codice compilato, non i risultati. Una query lenta è esattamente altrettanto lenta con opcache acceso. Se la sua pagina è lenta per quello che chiede al database, questo non cambia nulla - ed è la delusione più comune.
L'impostazione che nasconde un deploy
opcache.validate_timestamps=0 è più veloce e vuol dire che PHP non controlla mai se un file è cambiato. Il suo deploy parte e il sito continua a servire il codice vecchio, senza un errore da nessuna parte. Se lo imposta, il suo deploy DEVE svuotare la cache.# after deploying, with validate_timestamps=0
cachetool opcache:reset
# or reload the pool
systemctl reload php8.3-fpm
Sull'hosting EGPHP opcache è acceso e tarato sul pool. Questa pagina è per un VPS che gestisce lei.