PHP OPcache
Wat is PHP OPcache?
PHP OPcache is een extensie voor PHP die de snelheid van websites verbetert door het verwerken (compileren) van PHP-code naar code die in het geheugen opgeslagen wordt. Hierdoor hoeft de PHP-parser de code niet opnieuw uit te lezen en te verwerken bij elk websitebezoek wat meestal leidt tot snellere laadtijden en een lager CPU-gebruik. Vooral drukke websites en complexe applicaties profiteren van deze extensie.
Hoe gebruik ik PHP OPcache?
Standaard is de extensie op elke server aanwezig en er zijn geen aanvullende handelingen nodig om gebruik te maken van PHP OPcache.
PHP OPcache en ontwikkeling
Iedereen heeft een eigen manier van code schrijven en publiceren. Niet iedereen maakt gebruik van een
gestroomlijnd CI/CD-proces, bijvoorbeeld. Soms is het nodig dat er een snelle aanpassing direct op de server gedaan wordt of is een omgeving bij LinQhost juist een gescheiden ontwikkel- en productieplatform.
Het gebeurt regelmatig dat onze klanten aanpassingen in hun code niet direct terugzien. In de meeste gevallen is PHP OPcache dan de boosdoener. De cache wordt namelijk periodiek of pas na grote wijzigingen geleegd. Hier kun je hinder van ondervinden als je aan het ontwikkelen bent. Pagina's worden vaak nog vanuit de cache geserveerd, waardoor je je laatste aanpassingen niet direct terugziet. We hebben hiervoor twee oplossingen paraat:
- Als je een server of omgeving hebt waar uitsluitend op ontwikkeld wordt, dien dan een verzoek in om OPcache uit te laten schakelen. Hiervoor kun je een berichtje naar onze servicedesk sturen. We adviseren om OPcache niet uit te schakelen voor live systemen, omdat de voordelen ten opzichte van de serverprestaties gewenst zijn.
- Als je incidenteel iets aanpast of als er wel een CI/CD-proces (of vergelijkbaar) is ingericht, dan kun je een script gebruiken om de cache leeg te maken.
Hoe reset ik PHP OPcache?
Er zijn verschillende methoden om PHP OPcache te resetten; niet elke manier is echter beschikbaar voor onze klanten. Een goede methode voor onze klanten is het gebruik van een "reset"-script. Het is namelijk mogelijk om met PHP-code de cache te resetten. Hiervoor dient er een script aangemaakt te worden dat via het internet te benaderen is. Om je op weg te helpen, hebben we alvast een opzet gemaakt (gebruik is op eigen risico). Uiteraard kun je het voorbeeld uitbreiden met zaken als authenticatie of het gebruik van een (extern) configuratiebestand. Voor de meeste klanten zal de onderstaande code volstaan (let op, na de code volgt nog een korte toelichting):
- <?php
- // --- Configuration ---
- // Define allowed IP addresses.
- const ALLOWED_IPS = [
- '<je eigen IP-address>',
- // Add more allowed IPs here, e.g., '127.0.0.1'
- ];
- // --- End Configuration ---
- // Security Check: Ensure the script is executed via the web server (not via CLI)
- if (php_sapi_name() === 'cli') {
- // Write the error message to the Standard Error stream (STDERR) for CLI context
- fwrite(STDERR, "Fout: Dit script mag niet via de commandline (CLI) worden uitgevoerd.". PHP_EOL ) ;
- // Exit with a non-zero status code (1) to indicate failure
- exit(1);
- }
- // Set headers to prevent caching and specify content type
- header('Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate, proxy-revalidate');
- header('Content-Type: text/plain; charset=UTF-8');
- $remote_ip = $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN_IP';
- $timestamp = date('Y-m-d H:i:s');
- // 1. Access Control Check
- if (!in_array($remote_ip, ALLOWED_IPS)) {
- // Set 403 Forbidden status code and exit
- http_response_code(403);
- echo "Fout: U heeft geen toegang tot dit script." . PHP_EOL;
- echo "Uw IP-adres ($remote_ip) is niet toegestaan. ($timestamp)" . PHP_EOL;
- exit;
- }
- // 2. OPcache Reset Attempt
- if (opcache_reset()) {
- // Success response
- echo "--- OPcache Reset Success ---" . PHP_EOL;
- echo "OPcache geleegd ($timestamp)" . PHP_EOL;
- echo "Uitgevoerd door IP: $remote_ip" . PHP_EOL;
- echo "-----------------------------" . PHP_EOL;
- } else {
- // Failure response
- http_response_code(500); // Internal Server Error for execution failure
- echo "--- OPcache Reset Failed ---" . PHP_EOL;
- echo "OPcache legen mislukt ($timestamp)" . PHP_EOL . PHP_EOL;
- echo "Uitgevoerd door IP: $remote_ip" . PHP_EOL;
- // Dump status for debugging only if failure occurs
- echo "\nOPcache STATUS:" . PHP_EOL;
- var_dump(opcache_get_status());
- echo "----------------------------" . PHP_EOL;
- }
- exit;
Toelichting script
Het bovenstaande script kun je zowel tijdelijk als permanent op je website kunnen plaatsen. Om te voorkomen dat bots van zoekmachines of AI-tools het script indexeren is een eenvoudige IP-controle aanwezig. Alleen geautoriseerde IP-adressen mogen een reset uitvoeren. Ook is er een controle aanwezig om te voorkomen dat het via de command line (wanneer je via SSH op een server bent ingelogd) uitgevoerd wordt. Eenvoudig gezegd: PHP OPcache is enkel aanwezig voor pagina's die een bezoeker ziet of scripts die via het web aangeroepen worden.
Voor een goede werking is het dus belangrijk dat in ieder geval "<je eigen IP-address>" in het bovenstaande voorbeeld wordt aangepast. Hieronder volgen een paar voorbeelden betreffende het IP-adres die dient te gebruiken:
- Wanneer je het script simpelweg via een webbrowser aanroept, dan dien je je eigen IP-adres te gebruiken.
- Roep je het (wellicht geautomatiseerd) vanaf een extern systeem aan, dan zul je het IP-adres van dat systeem moeten toevoegen.
- En roep je het bijvoorbeeld op de zelfde server aan na een CI/CD-deployment met bijvoorbeeld cURL, wget of vergelijkbaar commando, dan zul je waarschijnlijk localhost, 127.0.0.1 of ::1 moeten toevoegen.
Een tweetal voorbeelden:
wget "https://www.website.nl/opcache_reset.php"