PHP 8 Performance-Tuning: OpCache und JIT erklärt
Ihre PHP 8-Anwendung fühlt sich unter Last träge an. Sie haben Abfragen optimiert und Caching hinzugefügt, aber die Antwortzeiten bleiben schleppend. Der Übeltäter könnte der Ausführungs-Overhead von PHP selbst sein. Zwei leistungsstarke Funktionen – OpCache und JIT – können Ihren Code drastisch beschleunigen, aber nur bei korrekter Konfiguration. Dieser Leitfaden erklärt, wie sie funktionieren und wie Sie sie für reale Workloads optimieren.
Was ist OpCache und warum ist es wichtig
PHP ist eine interpretierte Sprache: Jede Anfrage parst und kompiliert normalerweise Ihre Quelldateien in Bytecode, bevor sie ausgeführt wird. OpCache speichert diesen kompilierten Bytecode im Shared Memory, sodass nachfolgende Anfragen das Parsen und Kompilieren überspringen. Das Ergebnis? Geringere CPU-Auslastung und schnellere Antwortzeiten.
OpCache ist in vielen Produktionsumgebungen standardmäßig aktiviert, aber die Standardeinstellungen sind konservativ. Durch Tuning können Sie bei CPU-intensiven Anwendungen 2–3x höheren Durchsatz erzielen.
Wichtige OpCache-Konfigurationsdirektiven
- opcache.enable: Auf 1 setzen zum Aktivieren. (Standard: 1 in Produktion, 0 in CLI, sofern nicht überschrieben.)
- opcache.memory_consumption: Shared-Memory-Größe in MB. Beginnen Sie mit 128 MB; erhöhen Sie den Wert, wenn Sie eine hohe
opcache.memory_usagefeststellen. - opcache.max_accelerated_files: Maximale Anzahl zwischengespeicherter Dateien. Setzen Sie einen Primzahlwert, der größer als Ihre Gesamtzahl an PHP-Dateien ist (z. B. 10007).
- opcache.validate_timestamps: Bei 1 prüft PHP Dateizeitstempel auf Änderungen. Setzen Sie den Wert in Produktion auf 0, um stat-Aufrufe zu vermeiden; Sie müssen den Cache nach Deployments manuell leeren.
- opcache.revalidate_freq: Wie oft (in Sekunden) Zeitstempel geprüft werden, wenn validate_timestamps=1. Setzen Sie 0 für Entwicklung, 60+ für Produktion.
- opcache.interned_strings_buffer: Speicher für interned Strings (MB). Erhöhen Sie auf 16 oder 32 für große Anwendungen.
- opcache.fast_shutdown: Veraltet in PHP 7.2+, entfernt in PHP 8.0. Ignorieren.
- opcache.preload: Pfad zu einem Preload-Skript (PHP 7.4+). Preloading kompiliert und cached Dateien beim Start, wodurch der Overhead pro Anfrage für kritische Klassen entfällt.
Empfohlene OpCache-Einstellungen für die Produktion
; php.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.interned_strings_buffer=32
opcache.preload=/path/to/preload.php
opcache.preload_user=www-data
Nach Änderung der Einstellungen PHP-FPM neu starten. Überwachen Sie mit opcache_get_status() die Trefferquote und Speichernutzung.
JIT in PHP 8 verstehen
JIT (Just-In-Time)-Kompilierung geht einen Schritt weiter als OpCache: Sie kompiliert Bytecode zur Laufzeit in nativen Maschinencode. Dies kann CPU-intensive Aufgaben wie mathematische Berechnungen erheblich beschleunigen, bringt aber wenig für typische Webanfragen, die von I/O (Datenbank, Dateisystem, Netzwerk) dominiert werden.
JIT ist Teil von OpCache, daher müssen Sie zuerst OpCache aktivieren. In PHP 8 wird JIT über opcache.jit und opcache.jit_buffer_size konfiguriert.
JIT-Konfigurationsdirektiven
- opcache.jit: Steuert den JIT-Modus. Verwenden Sie
tracing(Standard) oderfunction. Der Wert ist ein 4-stelliger CRTO-Code:CRTO, wobei C=CPU-spezifische Optimierung, R=Registerzuweisung, T=Trigger, O=Optimierungsstufe. Für die meisten Anwendungen istopcache.jit=tracingin Ordnung. - opcache.jit_buffer_size: Speicher für JIT-Code in Bytes. Beginnen Sie mit 64M oder 128M. Bei 0 ist JIT deaktiviert.
- opcache.jit_hot_loop, opcache.jit_hot_func, opcache.jit_hot_return, opcache.jit_hot_side_exit: Schwellenwerte für die Erkennung von heißem Code. Die Standardwerte sind normalerweise in Ordnung.
Empfohlene JIT-Einstellungen
opcache.jit=tracing
opcache.jit_buffer_size=128M
Hinweis: JIT funktioniert nur mit aktiviertem OpCache. In CLI müssen Sie möglicherweise opcache.enable_cli=1 setzen, um JIT zu testen.
OpCache vs. JIT: Wann Sie was verwenden sollten
| Funktion | OpCache | JIT |
|---|---|---|
| Hauptvorteil | Cached kompilierten Bytecode | Kompiliert Bytecode in nativen Code |
| Am besten für | Alle PHP-Anwendungen | CPU-intensive, langlebige Skripte |
| Auswirkung auf I/O-gebundene Anwendungen | Hoch (reduziert Parsen/Kompilieren) | Gering bis keine |
| Speicher-Overhead | Mäßig | Zusätzlicher Puffer |
| Komplexität | Niedrig | Mittel |
Schritt-für-Schritt-Tuning-Anleitung
- OpCache aktivieren mit den oben empfohlenen Einstellungen.
- OpCache überwachen mit
opcache_get_status()oder Tools wie OpCache GUI. Streben Sie eine Trefferquote über 99 % an. - Speicher anpassen, wenn
opcache.memory_usagenahe am Limit ist. - Preloading in Betracht ziehen für große Frameworks (Laravel, Symfony). Erstellen Sie ein Preload-Skript, das häufig verwendete Klassen einbindet.
- JIT aktivieren nur, wenn Ihre Anwendung CPU-gebunden ist. Testen Sie mit und ohne JIT, um die Auswirkung zu messen.
- Benchmarking mit Tools wie
ab,wrkodersiege. Vergleichen Sie Anfragen pro Sekunde und Latenz. - Änderungen schrittweise deployen und Fehlerprotokolle auf Probleme überwachen.
Häufige Fallstricke und Best Practices
- Deaktivieren Sie validate_timestamps nicht in der Entwicklung: Sie werden Zeit damit verschwenden, sich zu fragen, warum Codeänderungen nicht wirksam werden.
- OpCache beim Deploy leeren: Wenn validate_timestamps=0, müssen Sie OpCache zurücksetzen (z. B. durch Neustart von PHP-FPM oder Aufruf von
opcache_reset()). - JIT ist keine Wunderwaffe: Für typische CRUD-Anwendungen bietet OpCache allein die meisten Vorteile.
- Speicher im Auge behalten: JIT-Puffer und OpCache-Speicher erhöhen den Footprint von PHP. Stellen Sie sicher, dass Ihr Server genügend RAM hat.
- Preloading sorgfältig verwenden: Vorgeladene Dateien sind immer im Speicher; vermeiden Sie, alles vorzuladen.
FAQ
Verbessert JIT die Leistung für alle PHP-Anwendungen?
Nein. JIT profitiert bei CPU-intensiven Aufgaben wie komplexen Berechnungen oder Datenverarbeitung. Bei I/O-gebundenen Webanwendungen (Datenbankabfragen, API-Aufrufe) sind die Gewinne minimal. OpCache allein bietet oft die größte Beschleunigung.
Wie erkenne ich, ob OpCache funktioniert?
Prüfen Sie phpinfo() auf den OpCache-Status oder rufen Sie opcache_get_status() in einem Skript auf. Suchen Sie nach opcache_enabled => true und einer hohen hits-Anzahl im Verhältnis zu misses.
Kann ich JIT mit PHP 7 verwenden?
Nein. JIT wurde in PHP 8.0 eingeführt. PHP 7 unterstützt nur OpCache. Wenn Sie PHP 7 verwenden, konzentrieren Sie sich auf OpCache-Tuning und ziehen Sie ein Upgrade auf PHP 8 in Betracht, um JIT und andere Leistungsverbesserungen zu nutzen.
Bereit, die Leistung Ihres Servers zu analysieren? Sehen Sie sich unseren Nginx Log Analyzer an, um Einblicke aus Ihren Zugriffsprotokollen zu gewinnen und Engpässe zu identifizieren.