Heim > Artikel > Backend-Entwicklung > Ausführliche Analyse der Funktionsweise von PHP Opcache
In PHP-Projekten, insbesondere in Szenarien mit hoher Parallelität und großem Datenverkehr, ist die Verbesserung der Antwortzeit von PHP eine sehr wichtige Aufgabe.
Opcache ist eine unverzichtbare Komponente zur Optimierung der PHP-Leistung, insbesondere in Projekten, die das PHP-Framework verwenden.
Bevor wir die OPCache-Funktion verstehen, müssen wir zunächst den Arbeitsmechanismus von PHP-FPM + Nginx und den Mechanismus der Interpretation und Ausführung von PHP-Skripten verstehen.
1.1 Arbeitsmechanismus von PHP-FPM + Nginx
Die Anfrage geht vom Webbrowser an Nginx und dann an die PHP-Verarbeitung. Es gibt insgesamt fünf Schritte:
Schritt 1: Starten Sie den Dienst
Schritt 2: Anfrage => Nginx. Nginx => PHP-FPM
PHP-FPM-Masterprozess empfängt die Anfrage
und weist dem Worker-Prozess die Ausführung des PHP-Skripts zu. Wenneine Zeitüberschreitung aufweist, 504-Fehler zurückgeben
1.2 Der Mechanismus der Erklärung und Ausführung von PHP-Skripten
<?php if (!empty($_POST)) { echo "Response Body POST: ", json_encode($_POST), "\n"; } if (!empty($_GET)) { echo "Response Body GET: ", json_encode($_GET), "\n"; }
Lassen Sie uns den Ausführungsprozess analysieren:
php initialisiert den Ausführungslink, startet die Zend-Engine, lädt das registrierte Erweiterungsmodul
Nach der Initialisierung wird die Skriptdatei gelesen und die Zend-Engine führt lexikalische Operationen aus Analyse (Lex) der Skriptdatei), Grammatikanalyse (BISON). Im PHP-CLI-Modus werden die vier Schritte nacheinander ausgeführt.
Im PHP-FPM-Modus muss jede Anfrage einmal verarbeitet werden, was eine enorme Verschwendung von Systemressourcen darstellt Gibt es eine Möglichkeit, es zu optimieren? Natürlich gibt es, wie zum Beispiel:
OPCache: früher bekannt als Zend Optimizer+, ist eine Open-Source-Komponente von Zend Server, sehr zu empfehlen;APCu: Es ist ein Zweig von APC, gemeinsam genutzter Speicher, Cache-Benutzerdaten, kann Opcode nicht zwischenspeichern, kann auch mit Opcache verwendet werdeneAccelerate: auch nicht mehr aktualisiert, nicht empfohlen
xCache: Es wird nicht mehr empfohlen,OPCache ist eine offene und kostenlose Opcode-Cache-Erweiterung, die offiziell von Zend produziert wurde. Dadurch entfällt die Notwendigkeit, jedes Mal PHP-Skripte laden und analysieren zu müssen. OPcache-Erweiterung wurde in PHP 5.5.0 und nachfolgenden Versionen gebündelt.
Zwei Arten von Inhalten zwischenspeichern:
OPCodeInterne Zeichenfolge, wie Kommentare, Variablennamen usw.3.1 Gemeinsamer Speicher
UNIX/Linux-System bietet viele Möglichkeiten, Speicher zwischen Prozessen zu teilen:
Ein großer Vorteil von mmap besteht darin, dass die Datei dem Adressraum des Prozesses zugeordnet wird vermeidet die Notwendigkeit, Daten vom Benutzerpuffer in den Kopiervorgang des Kernel-Seiten-Cache-Puffers zu übertragen.
Ein weiterer Vorteil besteht natürlich darin, dass keine häufigen Lese-/Schreib-Systemaufrufe erforderlich sind.POSIX-API: Der gemeinsam genutzte Speicher von System V ist veraltet. Der gemeinsam genutzte POSIX-Speicher bietet eine einfachere Verwendung und eine rationaler gestaltete API. Basierend auf dem PHP-Bytecode-Caching-Szenario ist das Speicherverwaltungsdesign von OPCache sehr einfach: schnelles Lesen und Schreiben, keine Speicherfreigabe und abgelaufene Daten sind auf „Verschwendet“ gesetzt.
Wenn der verschwendete Speicher größer als der eingestellte Wert ist, wird der OPCache-Mechanismus automatisch neu gestartet, der Cache wird geleert und neu generiert.4.1 OPCode-Cache
Opcache speichert OPCode und den folgenden Inhalt:4.2 Interner String-Cache
Zuerst müssen wir Verstehe, was ist Interned String?
In PHP5.4 wurde der Interned String-Mechanismus eingeführt, um die Speicherung und Verarbeitung von Strings durch PHP zu optimieren.
Vor allem beim Umgang mit großen String-Blöcken, wie z. B. PHP-Dokumenten, kann Interned String den Speicher optimieren.
Der intern zwischengespeicherte String-Inhalt umfasst: Variablennamen, Klassennamen, Methodennamen, Zeichenfolgen, Kommentare usw.
Im PHP-FPM-Modus sind internierte String-Cache-Zeichen auf den Worker-Prozess beschränkt.
Bei Zwischenspeicherung im OPCache kann die zwischengespeicherte Zeichenfolge „Interned String“ zwischen Worker-Prozessen verwendet werden, um Speicher zu sparen.
Auf eines müssen wir achten: In der PHP-Entwicklung gibt es normalerweise große Kommentarabschnitte, die auch im OPCache zwischengespeichert werden.
Sie können das Zwischenspeichern von Kommentaren über die Konfiguration von php.ini deaktivieren.
In Frameworks wie dem Zend Framework referenziert jedoch Annotationen, daher muss die Frage, ob das Caching von Annotationen deaktiviert werden soll, anders gehandhabt werden.
ist ein Cache, der Ablauf- und Update-Strategien hat.
Die Update-Strategie von OPCache ist sehr einfach. Die abgelaufenen Daten werden auf „Verschwendet“ gesetzt. Wenn der eingestellte Wert erreicht ist, wird der Cache geleert und neu erstellt.
Hinweis hier: In Szenarien mit hohem Datenverkehr ist der Neuaufbau des Caches eine sehr ressourcenintensive Aufgabe.
OPCache verhindert nicht, dass andere Prozesse beim Erstellen des Caches lesen.
Dies führt dazu, dass eine große Anzahl von Prozessen immer wieder neue Caches erstellt. Deshalb: Stellen Sie die OPCache-Ablaufzeit nicht ein
Jedes Mal, wenn Sie neuen Code veröffentlichen, wird der Cache wiederholt erstellt. Wie kann man es vermeiden?
opcache_compile_file ()
Kompilierungs-Caching durchführenopcache_compile_file()
进行编译缓存6.1 内存配置
opcache.preferred_memory_model="mmap"
OPcache 首选的内存模块。如果留空,OPcache 会选择适用的模块, 通常情况下,自动选择就可以满足需求。可选值包括: mmap
,shm
, posix
以及 win32
。opcache.memory_consumption=64
OPcache 的共享内存大小,以兆字节为单位,默认64M
opcache.interned_strings_buffer=4
用来存储临时字符串的内存大小,以兆字节为单位,默认4M
opcache.max_wasted_percentage=5
浪费内存的上限,以百分比计。 如果达到此上限,那么 OPcache 将产生重新启动续发事件。默认5
6.2 允许缓存的文件数量以及大小
opcache.max_accelerated_files=2000
OPcache 哈希表中可存储的脚本文件数量上限。 真实的取值是在质数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 }
中找到的第一个大于等于设置值的质数。 设置值取值范围最小值是 200
,最大值在 PHP 5.5.6 之前是 100000
,PHP 5.5.6 及之后是 1000000
。默认值2000
opcache.max_file_size=0
以字节为单位的缓存的文件大小上限。设置为 0 表示缓存全部文件。默认值06.3 注释相关的缓存
opcache.load_comments
boolean
如果禁用,则即使文件中包含注释,也不会加载这些注释内容。 本选项可以和 opcache.save_comments
一起使用,以实现按需加载注释内容。opcache.fast_shutdown
6.1 Speicherkonfiguration
🎜🎜 🎜opcache. Preferred_memory_model="mmap"
OPcache bevorzugtes Speichermodul. Wenn das Feld leer bleibt, wählt OPcache das entsprechende Modul aus. Normalerweise reicht die automatische Auswahl aus. Zu den optionalen Werten gehören: mmap
, shm
, posix
und win32
. 🎜🎜opcache.memory_consumption=64
Die gemeinsam genutzte Speichergröße von OPcache, in Megabyte, standardmäßig 64M
🎜🎜opcache.interned_strings_buffer=4
Die Speichergröße Wird zum Speichern temporärer Zeichenfolgen verwendet, in Megabyte, Standard 4M
🎜🎜opcache.max_wasted_percentage=5
Die Obergrenze des verschwendeten Speichers, in Prozent. Wenn dieses Limit erreicht ist, generiert OPcache ein Neustartereignis. Standardwert 5
🎜🎜🎜🎜6.2 Anzahl und Größe der Dateien, die zwischengespeichert werden dürfen🎜🎜🎜🎜🎜opcache.max_accelerated_files=2000
OPcache-Hash Tabelle Die maximale Anzahl von Skriptdateien, die in gespeichert werden können. Der tatsächliche Wert ist die erste Primzahl im Primzahlensatz { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987
, die größer oder gleich ist Wert einstellen. Der minimale Wertebereich des Einstellungswerts ist 200
, der maximale Wert vor PHP 5.5.6 ist 100000
und PHP 5.5.6 und höher ist 1000000 Code> . Standardwert <code>2000
🎜🎜opcache.max_file_size=0
Die maximale Dateigröße des Caches in Bytes. Auf 0 setzen, um alle Dateien zwischenzuspeichern. Standardwert 0 Kommentare und deren Inhalte werden nicht geladen. Diese Option kann zusammen mit opcache.save_comments
verwendet werden, um Kommentarinhalte bei Bedarf zu laden. 🎜🎜opcache.fast_shutdown
boolean Wenn aktiviert, werden Fast-Stop-Resume-Ereignisse verwendet. Das sogenannte Quick-Stop-Resumption-Ereignis bezieht sich auf das Speicherverwaltungsmodul, das auf der Zend-Engine basiert, um den Speicher aller angeforderten Variablen auf einmal freizugeben, anstatt jeden zugewiesenen Speicherblock nacheinander freizugeben. 🎜🎜🎜🎜🎜6.4 Cache-Konfiguration der zweiten Ebene🎜🎜🎜opcache.file_cache
Konfigurieren Sie das Cache-Verzeichnis der zweiten Ebene und aktivieren Sie den Cache der zweiten Ebene. Durch die Aktivierung des L2-Cache kann die Leistung verbessert werden, wenn der SHM-Speicher voll ist, der Server neu gestartet oder der SHM zurückgesetzt wird. Der Standardwert ist die leere Zeichenfolge ""
, die das dateibasierte Caching deaktiviert. opcache.file_cache
配置二级缓存目录并启用二级缓存。 启用二级缓存可以在 SHM 内存满了、服务器重启或者重置 SHM 的时候提高性能。 默认值为空字符串 ""
,表示禁用基于文件的缓存。opcache.file_cache_only
boolean
启用或禁用在共享内存中的 opcode 缓存。opcache.file_cache_consistency_checks
boolean
当从文件缓存中加载脚本的时候,是否对文件的校验和进行验证。opcache.file_cache_fallback
boolean
在 Windows 平台上,当一个进程无法附加到共享内存的时候, 使用基于文件的缓存,也即:opcache.file_cache_only=1
opcache.file_cache_only
boolean
Opcode-Caching im gemeinsam genutzten Speicher aktivieren oder deaktivieren. opcache.file_cache_consistency_checks
boolean
Ob die Prüfsumme der Datei überprüft werden soll, wenn das Skript aus dem Dateicache geladen wird. opcache.file_cache_fallback
boolean
Wenn ein Prozess auf Windows-Plattformen keine Verbindung zum gemeinsam genutzten Speicher herstellen kann, wird ein dateibasierter Cache verwendet, das heißt: opcache_only =1
. Das Datei-Caching muss explizit aktiviert werden.
Das obige ist der detaillierte Inhalt vonAusführliche Analyse der Funktionsweise von PHP Opcache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!