PHP is een geïnterpreteerde taal: voordat het een bestand uitvoert, leest het dat bestand, analyseert het en vertaalt het naar interne instructies, de opcodes. Zonder cache wordt dat werk bij elk verzoek opnieuw gedaan, voor elk geladen bestand. De PHP-documentatie vat de rol van OPcache zo samen: het slaat de voorgecompileerde bytecode van scripts op in gedeeld geheugen, waardoor PHP de scripts niet bij elk verzoek hoeft te laden en te analyseren.
Hoe OPcache werkt
OPcache is een extensie die met PHP wordt meegeleverd en via de directive zend_extension wordt geladen. Bij de eerste uitvoering van een bestand komen de opcodes in gedeeld geheugen. Volgende verzoeken gebruiken ze direct opnieuw, welke PHP-FPM-worker het verzoek ook verwerkt, omdat het geheugen gedeeld wordt door de processen van dezelfde master.

Om wijzigingen op te merken, controleert OPcache standaard elke twee seconden de datum van de bestanden (opcache.revalidate_freq=2). Schakel je die controle uit (opcache.validate_timestamps=0), wat in productie wat kan opleveren, dan worden gewijzigde bestanden pas opgemerkt als de cache wordt geleegd met opcache_reset() of door PHP te herstarten.
De nuttige instellingen
Standaardwaarden volgens de PHP-documentatie:
opcache.memory_consumption: 128 MB gedeeld geheugen;opcache.max_accelerated_files: maximaal 10.000 bestanden;opcache.interned_strings_buffer: 8 MB voor interned strings;opcache.revalidate_freq: 2 seconden.
Een WordPress-site met een pagebuilder, WooCommerce en een stuk of twintig plugins kan boven het voorziene aantal bestanden of het geheugen uitkomen. Daarboven wordt een deel van de scripts niet meer gecachet en kalft de winst af. De functie opcache_get_status() of een diagnoseplugin toont hoe vol de cache zit.
Sinds PHP 7.4 laadt preloading (opcache.preload) bestanden bij het starten van PHP. Het is niet beschikbaar onder Windows en vraagt een herstart om bij te werken: het past beter bij applicaties die weinig veranderen dan bij een WordPress-site die vaak wordt bijgewerkt.
Voor WordPress
De documentatie van WordPress raadt aan een opcodecache als OPcache toe te voegen om de prestaties van PHP sterk te verbeteren. Het vult de paginacache en de objectcache aan, zonder ze te vervangen: OPcache voorkomt het compileren van code, de objectcache voorkomt databasequery's, de paginacache voorkomt dat PHP überhaupt draait.
- Bij shared hosting staat OPcache normaal gesproken aan; controleer het met phpinfo() of in de PHP-instellingen van je paneel.
- Op een VPS stem je het geheugen en het aantal bestanden af op de werkelijke omvang van je sites.
- Bij een update naar een andere PHP-versie herlaad je PHP-FPM om met een schone cache te beginnen; meteen een goed moment om te controleren of de gekozen versie nog wordt onderhouden (zie de PHP-versies die end-of-life zijn).
Beveiliging
Op een gedeelde server is de cache gemeenschappelijk voor de pools van dezelfde PHP-FPM-master. Directives als opcache.validate_permission en opcache.validate_root bestaan om de rechten op gecachete bestanden te controleren en botsingen in chroot-omgevingen te voorkomen. De directive opcache.restrict_api beperkt het gebruik van de OPcache-functies tot een bepaald pad, zodat niet zomaar een script de cache kan legen. Deze instellingen vullen die uit onze gids om PHP te harden aan.
Veelgemaakte fouten
validate_timestamps uitschakelen en dan niet begrijpen waarom een gewijzigd bestand niet zichtbaar wordt; het standaardgeheugen laten staan op een grote site; denken dat OPcache een paginacache vervangt.