Bevor PHP ein Skript ausführt, liest es den Quelltext, zerlegt ihn und übersetzt ihn in sogenannte Opcodes, also Befehle für die PHP-Laufzeit. Ohne Zwischenspeicher wiederholt sich das bei jeder Anfrage, obwohl sich der Code meist nicht geändert hat. OPcache, ausgeschrieben Opcode Cache, speichert das Ergebnis im Arbeitsspeicher und spart diese Arbeit. Laut PHP-Handbuch ist die Erweiterung seit PHP 5.5.0 Bestandteil von PHP. In produktiven Umgebungen gehört sie zur Grundausstattung.
Wie OPcache funktioniert
- Zwischenspeicher im Shared Memory: Der übersetzte Bytecode liegt in einem Speicherbereich, den alle Arbeitsprozesse eines PHP-FPM-Dienstes gemeinsam nutzen.
- Änderungserkennung: Standardmäßig prüft OPcache in Abständen, ob sich Dateien geändert haben, und übersetzt sie dann neu.
- Preloading: Seit PHP 7.4.0 kann ein Skript beim Start Funktionen und Klassen vorab laden, die danach allen Anfragen zur Verfügung stehen. Laut Handbuch wird Preloading unter Windows nicht unterstützt.
- JIT-Compiler: Seit PHP 8.0 kann OPcache Teile des Codes zusätzlich in Maschinencode übersetzen. Seit PHP 8.4 ist der JIT standardmäßig deaktiviert (
opcache.jit=disable) und muss bewusst eingeschaltet werden.
Wichtige Einstellungen
Die Standardwerte laut PHP-Handbuch, alle Einstellungen beginnen mit dem Präfix opcache.:
enable: 1, OPcache ist aktivmemory_consumption: 128 MB Speicher für den Zwischenspeicherinterned_strings_buffer: 8 MB für mehrfach verwendete Zeichenkettenmax_accelerated_files: 10000 Skriptevalidate_timestamps: 1, Dateien werden auf Änderungen geprüftrevalidate_freq: 2 Sekunden zwischen zwei Prüfungen
Große Anwendungen mit vielen Bibliotheken, etwa auf Basis von Laravel, brauchen oft mehr Speicher und einen höheren Wert für die Zahl der Skripte. Ob die Werte passen, zeigt die Funktion opcache_get_status(): Ist der Speicher voll oder sinkt die Trefferquote, arbeitet der Zwischenspeicher nicht wie gewünscht.
Praxis: OPcache und Deployments
Viele Teams schalten im Produktivbetrieb opcache.validate_timestamps ab, um die Dateiprüfung einzusparen. Das PHP-Handbuch weist darauf hin, dass OPcache Änderungen dann nicht mehr erkennt. Nach jedem Deployment muss der Zwischenspeicher mit opcache_reset() geleert oder der PHP-Dienst neu geladen werden. Fehlt dieser Schritt in der CI/CD-Pipeline, liefert der Server weiter den alten Code aus, teilweise gemischt mit neuen Dateien.
Eine gängige Vorgehensweise ist, neue Versionen in ein eigenes Verzeichnis auszurollen, den Verweis darauf umzuschalten und anschließend PHP-FPM geordnet neu zu laden. So wechseln alle Prozesse gemeinsam auf den neuen Stand, und der Weg zurück auf die vorige Version bleibt offen.
Typische Fehlerbilder
- Nach einem Update erscheinen alte Inhalte oder Fehler, die schon behoben sein sollten.
- Die Trefferquote sinkt unter Last, weil
opcache.memory_consumptionoderopcache.max_accelerated_fileszu klein sind. - Der JIT wird ohne Messung aktiviert. Ob er einer typischen Webanwendung hilft, sollte ein Lasttest mit realistischen Anfragen zeigen.
- Auf Servern mit mehreren Websites teilen sich Anwendungen ungewollt Ressourcen.
Sicherheit
- Die Verwaltungsfunktionen von OPcache, etwa zum Leeren oder Auslesen, lassen sich mit
opcache.restrict_apiauf Skripte in einem bestimmten Pfad beschränken. Das ist auf Servern mit mehreren Anwendungen sinnvoll. - Statusausgaben gehören nicht öffentlich ins Web, denn sie verraten Pfade und Dateistruktur.
- Preloading lädt Klassen für die gesamte Lebensdauer des Prozesses. Laut Handbuch sollten sich Websites deshalb keinen gemeinsamen Prozess teilen, sondern eigene PHP-FPM-Pools verwenden.
- Änderungen an OPcache-Einstellungen wie jede Konfigurationsänderung planen und dokumentieren, siehe Change Management.
Abgrenzung
OPcache speichert übersetzten Programmcode. Daten-Caches wie APCu oder Redis speichern dagegen Ergebnisse, etwa Datenbankabfragen. Seiten-Caches und Content Delivery Networks liefern ganze Antworten aus, ohne dass PHP überhaupt läuft. Die Ebenen ergänzen sich. Wie gut das Zusammenspiel funktioniert, zeigt ein IT-Monitoring mit Antwortzeiten und Fehlerraten.
Häufige Fragen
Wie erkenne ich, ob OPcache aktiv ist?
Am zuverlässigsten über opcache_get_status() in einer geschützten Diagnoseseite oder über die Statusausgabe des Monitorings. Achtung: Für die Kommandozeile ist OPcache standardmäßig ausgeschaltet (opcache.enable_cli steht auf 0). Ein Aufruf von php -i in der Shell zeigt deshalb nicht unbedingt den Zustand des Webservers.
Soll ich den JIT einschalten?
Nur nach Messung. Der JIT übersetzt Code zusätzlich in Maschinencode und hilft vor allem bei rechenintensiven Aufgaben. Viele Webanwendungen verbringen ihre Zeit dagegen mit Datenbankabfragen und Netzwerkzugriffen. Seit PHP 8.4 muss der JIT ausdrücklich aktiviert werden.
Muss ich OPcache nach jedem Update leeren?
Wenn opcache.validate_timestamps aktiv ist, erkennt OPcache geänderte Dateien nach kurzer Zeit selbst. Ist die Prüfung abgeschaltet, gehört das Leeren oder Neuladen fest in jedes Deployment.