PHP OPcache
Der PHP OPcache ist ein PHP-Modul, das den PHP-Code der Webanwendung (wie Shopware oder Magento) im Arbeitsspeicher zwischenspeichert.
Hintergrund
Was ist OPcache?
Der PHP OPcache ist ein PHP-Modul, das den PHP-Code der Webanwendung (wie Shopware oder Magento) im Arbeitsspeicher zwischenspeichert. Hierdurch werden diese wesentlich schneller ausgeführt und die PHP-Skripte müssen nicht bei jeder Ausführung neu geparst werden.
Wie überprüfe ich den PHP OPcache? Der aktuelle Status vom PHP OPcache lässt sich einfach über das Cachetool von Samuel Gordalina überprüfen. Wichtig ist hier, dass dies über den jeweiligen Socket von FPM erfolgen muss.
Ein Aufruf wie
cachetool opcache:status --fcgi=/var/run/php7.4-fpm-default.sock
zeigt dabei unter anderem die aktuelle Belegung und die Hitrate.
Was ist OPcache preloading?
Seit PHP 7.4 ist es möglich, über OPcache preloading beim Starten von PHP ein Skript anzugeben, das direkt geparsed werden soll. Damit kann man sicherstellen, dass auch nach einem Deployment alle relevanten PHP-Dateien schnell verfügbar sind. Die Konfiguration hierzu erfolgt über die Variablen opcache.preload und opcache.preload_user. Diese Funktion sollte mit Vorsicht verwendet werden, da nach dem Preload alle geladenen Funktionen und Klassen innerhalb von PHP zur Verfügung stehen – auch wenn Sie in dem PHP-Skript, das diese aufgerufen hat, gar nicht explizit eingebunden wurden. Weitere Details zum Preloading finden Sie hier: https://www.php.net/manual/de/opcache.preloading.php
Was ist der OPcache Just in Time Compiler (JIT)?
Mit PHP 8.0 wurde der PHP OPcache um einen JIT erweitert. Während der Bytecode, der im OPcache gespeichert wird, weiterhin von der PHP VM interpretiert wird, entfällt dieser Schritt beim JIT. Der JIT kann daher häufig verwendete Codepfade direkt in Maschinencode speichern, womit sich bei rechenintensiven PHP-Anwendungen die Performance erheblich verbessert. Bei klassischen PHP-Anwendungen, die sehr stark von der Datenbank und ähnlichen Diensten abhängig sind, ist dieser Effekt allerdings deutlich geringer.
Um den JIT zu verwenden, genügt es in den PHP-Standardeinstellungen den Wert opcache.jit_buffer_size zu vergrößern.
Lösung
Welche Werte sollten wie konfiguriert sein?
Unserer Erfahrung nach sind die folgenden vier Einstellungen sehr wichtig:
opcache.memory_consumption
opcache.max_accelerated_files
opcache.interned_strings_buffer
opcache.revalidate_freq
Für die drei ersten Einstellungen sind die optimalen Werte von der jeweils verwendeten PHP-Einstellung abhängig. Der Wert opcache.revalidate_freq steuert wie oft geprüft wird, ob sich eine PHP-Datei geändert hat.
opcache.memory_consumption steuert dabei, wieviel Arbeitsspeicher maximal für den OPcache verwendet werden darf. Hier ist sicherzustellen, das auch ausreichend freier Arbeitsspeicher vorhanden ist.
Für Shopware- und Magento-Shops kommt man hier üblicherweise mit 512MB aus. Für kleinere PHP-Projekte genügen entsprechend auch weniger Arbeitsspeicher.
opcache.max_accelerated_files steuert, die Anzahl der Dateien, die maximal vom OPcache gecacht werden sollen. Die angegebene Zahl wird auf einen der folgenden Werte aufgerundet:
- 223
- 463
- 983
- 1979
- 3907
- 7963
- 16229
- 32531
- 65407
- 130987
- 262237
- 524521
- 1048793
Unserer Erfahrung nach sind 65407 Dateien für Shopware- und Magento-Shops ausreichend.
Neben dem Cachen kompletter PHP-Dateien, kann der OPcache auch Strings cachen. Dies erfolgt über den Wert opcache.interned_strings_buffer. Mit 64MB kommen Magento- und Shopware-Shops unserer Erfahrung nach aus.
Der Wert opcache.revalidate_freq steuert wie oft geprüft wird, ob sich eine PHP-Datei geändert hat. Ein Wert von 60, sorgt daher dafür, das alle 60 Sekunden geprüft wird, ob sich die PHP-Dateien geändert haben. Für einen stark frequentierten Shop empfehlen wir daher eine Einstellung von mindestens 60. Es ist alternativ auch möglich, die Prüfung über die Einstellung opcache.validate_timestamps komplett zu deaktivieren. In diesem Fall werden geänderte PHP-Skripte nur bei einem PHP-Reload oder -Restart angewandt. Ab PHP 8.0 lohnt es sich auch, die opcache.jit_buffer_size zu setzen, um vom JIT profitieren zu können.
Was ist beim Deployment zu beachten?
Damit der OPcache von alten Daten befreit wird, empfehlen wir generell nach jedem Deployment den OPcache komplett zu leeren. Dies ist durch einen PHP-Reload über unser Tool cluster-control automatisiert möglich.
OPcache bei maxcluster
Bei maxcluster können Sie die OPcache-Einstellungen im Application Center unter Webserver > Apache oder Webserver > NGINX über das Kundeninterface selbst verwalten.
Wenn Sie Fragen zu unserem OPcache haben oder bei der Anpassung an Ihre Anwendung Unterstützung benötigen, kontaktieren Sie uns bitte unter support@maxcluster.de.