PHP OPcache

PHP OPcache

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:
  1. 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.
  2. 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):
  1. <?php

  2. // --- Configuration ---
  3. // Define allowed IP addresses.
  4. const ALLOWED_IPS = [
  5.     '<je eigen IP-address>',
  6.     // Add more allowed IPs here, e.g., '127.0.0.1'
  7. ];
  8. // --- End Configuration ---

  9. // Security Check: Ensure the script is executed via the web server (not via CLI)
  10. if (php_sapi_name() === 'cli') {
  11.     // Write the error message to the Standard Error stream (STDERR) for CLI context
  12.     fwrite(STDERR, "Fout: Dit script mag niet via de commandline (CLI) worden uitgevoerd.". PHP_EOL  ) ;
  13.     // Exit with a non-zero status code (1) to indicate failure
  14.     exit(1); 
  15. }

  16. // Set headers to prevent caching and specify content type
  17. header('Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate, proxy-revalidate');
  18. header('Content-Type: text/plain; charset=UTF-8');

  19. $remote_ip = $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN_IP';
  20. $timestamp = date('Y-m-d H:i:s');

  21. // 1. Access Control Check
  22. if (!in_array($remote_ip, ALLOWED_IPS)) {
  23.     // Set 403 Forbidden status code and exit
  24.     http_response_code(403);
  25.     echo "Fout: U heeft geen toegang tot dit script." . PHP_EOL;
  26.     echo "Uw IP-adres ($remote_ip) is niet toegestaan. ($timestamp)" . PHP_EOL;
  27.     exit;
  28. }

  29. // 2. OPcache Reset Attempt
  30. if (opcache_reset()) {
  31.     // Success response
  32.     echo "--- OPcache Reset Success ---" . PHP_EOL;
  33.     echo "OPcache geleegd ($timestamp)" . PHP_EOL;
  34.     echo "Uitgevoerd door IP: $remote_ip" . PHP_EOL;
  35.     echo "-----------------------------" . PHP_EOL;
  36. } else {
  37.     // Failure response
  38.     http_response_code(500); // Internal Server Error for execution failure
  39.     echo "--- OPcache Reset Failed ---" . PHP_EOL;
  40.     echo "OPcache legen mislukt ($timestamp)" . PHP_EOL . PHP_EOL;
  41.     echo "Uitgevoerd door IP: $remote_ip" . PHP_EOL;

  42.     // Dump status for debugging only if failure occurs
  43.     echo "\nOPcache STATUS:" . PHP_EOL;
  44.     var_dump(opcache_get_status());
  45.     echo "----------------------------" . PHP_EOL;
  46. }

  47. 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:
  1. Wanneer je het script simpelweg via een webbrowser aanroept, dan dien je je eigen IP-adres te gebruiken.
  2. Roep je het (wellicht geautomatiseerd) vanaf een extern systeem aan, dan zul je het IP-adres van dat systeem moeten toevoegen.
  3. 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:
  1. curl -k -H "Host: www.website.nl" https://localhost/opcache_reset.php
  2. wget "https://www.website.nl/opcache_reset.php"
    • Related Articles

    • Veelvoorkomende HTTP-foutcodes en oplossingen

      Het kan gebeuren dat je website plots niet meer bereikbaar is, met een driecijferige foutcode op je scherm. Wat nu? We bespreken de zes meest voorkomende HTTP-foutcodes, wat ze betekenen, en hoe je ze oplost. 401 Error - Unauthorized Een 401-error ...
    • Oplossing voor 502 Bad Gateway bij het laden van je website

      Bezoek je je website en zie je dat deze maar blijft laden? Na lang wachten verschijnt de vervelende melding: 502 Bad Gateway. Wat betekent dit precies, en wat kun je doen om dit te voorkomen? Wat veroorzaakt een 502 Bad Gateway? Wanneer je website ...
    • Metadata bezoekende IP-adres opvragen

      Algemeen Onze HPW-webservers proberen verschillende belangrijke geografische gegevens te koppelen aan het IP-adres van de bezoeker. Deze gegevens worden als servervariabelen meegegeven, zodat onze klanten ze kunnen gebruiken in hun applicaties. Dit ...
    • Mcrypt is verleden tijd: dit is wat je nu moet doen

      In 2017 komt PHP 7.2 uit en met deze nieuwe versie verdwijnt de verouderde en onveilige PHP-Mcrypt module definitief. Mcrypt wordt al enige tijd afgeraden omdat het niet meer veilig en betrouwbaar is. Toch blijkt uit enkele steekproeven dat sommige ...
    • Cronjob instellen

      Wil je processen op ‘gezette tijden’ starten? Dan gebruik je Cronjob als programma. Het instellen van cronjobs kun je zelf doen op onze HPW server. In dit artikel geven we graag informatie over hoe je dit precies doet, zodat je zelf gemakkelijk jouw ...