Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Analyse der Funktionsweise von PHP Opcache

Ausführliche Analyse der Funktionsweise von PHP Opcache

藏色散人
藏色散人nach vorne
2022-01-05 14:01:444221Durchsuche

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.

1. Überblick

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

  • Starten Sie PHP-FPM. PHP-FPM unterstützt zwei Kommunikationsmodi: TCP-Socket und Unix-Socket;
  • PHP-FPM wird zwei Arten von Prozessen starten: Ersterer ist für die Überwachung von Ports, die Zuweisung von Aufgaben usw. verantwortlich Verwalten von Workers. Letzteres ist das CGI-Programm von PHP, das für die Interpretation, Kompilierung und Ausführung von PHP-Skripten verantwortlich ist.
  • Starten Sie Nginx. Zuerst wird das Modul ngx_http_fastcgi_module geladen, wodurch die FastCGI-Ausführungsumgebung initialisiert und der FastCGI-Protokollanforderungs-Proxy implementiert wird.
  • Hinweis hier: Der Fastcgi-Worker-Prozess (CGI-Prozess) wird von PHP-FPM und nicht von Nginx verwaltet. Nginx ist nur ein Proxy.

Schritt 2: Anfrage => Nginx. Nginx => PHP-FPM

  • Nginx übersetzt die Anfrage in eine Fastcgi-Anfrage
  • und sendet sie über TCP-Socket/Unix-Socket an den Masterprozess von PHP-FPM. Schritt 4: PHP-FPM-Master = > Worker

PHP-FPM-Masterprozess empfängt die Anfrage

und weist dem Worker-Prozess die Ausführung des PHP-Skripts zu. Wenn
  • kein inaktiver Worker vorhanden ist, wird ein 502-Fehler zurückgegeben
Worker (php-. cgi)-Prozess führt das PHP-Skript aus, wenn

eine Zeitüberschreitung aufweist, 504-Fehler zurückgeben

  • Die Verarbeitung ist abgeschlossen, Ergebnis zurückgeben
  • Schritt 5: PHP-FPM Worker => Master => Nginx
  • PHP -FPM-Worker-Prozess gibt das Verarbeitungsergebnis zurück und schließt die Verbindung, wartet auf die nächste AnfragePHP-FPM-Master-Prozess gibt das Verarbeitungsergebnis über Socket zurückNginx-Handler sendet jeden Antwortpuffer nacheinander an den ersten Filter → den zweiten → und so weiter on → Die endgültige Antwort wird an den Client gesendet

1.2 Der Mechanismus der Erklärung und Ausführung von PHP-Skripten

    Nachdem wir den gesamten Verarbeitungsablauf von PHP + Nginx verstanden haben, werfen wir einen Blick auf den spezifischen Ausführungsablauf von PHP Skripte.
  • Zuerst schauen wir uns ein Beispiel an:
<?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.

    • Schritt 1) ​​wird einmal ausgeführt, wenn PHP-FPM gestartet wird, und wird in nachfolgenden Anfragen nicht erneut ausgeführt. Führen Sie die Schritte 2) bis 4) einmal für jede Anfrage aus
    • 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;
    • APC: Alternative PHP Cache ist ein offener und kostenloser PHP-Opcode Caching-Komponente, wird zum Caching verwendet, PHP-Zwischencode optimieren; nicht mehr aktualisiert, nicht empfohlen

      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,

    2 zu verwenden. Einführung in OPCache

    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:

    OPCode

    Interne Zeichenfolge, wie Kommentare, Variablennamen usw.
    • 3. OPCache-Prinzip
    • Der Hauptmechanismus des OPCache-Caching ist:
    • Kompilierte Opcode im Shared Memory wird für den Zugriff anderer Prozesse bereitgestellt
    • .

    Dabei geht es um den Speicherfreigabemechanismus. Darüber hinaus weisen alle Speicherressourcenoperationen Sperrprobleme auf. Lassen Sie uns diese einzeln erklären.

    3.1 Gemeinsamer Speicher

    UNIX/Linux-System bietet viele Möglichkeiten, Speicher zwischen Prozessen zu teilen:

    • System-V shm API: System V gemeinsam genutzter Speicher,
    • sysv shm ist persistent, es sei denn, es handelt sich um einen Prozess explizit gelöscht, andernfalls bleibt es immer im Speicher, bis das System heruntergefahren wird;

    mmap-zugeordneter Speicher ist nicht dauerhaft. Wenn der Prozess heruntergefahren wird, wird die Zuordnung ungültig, es sei denn, sie wurde zugeordnet im Voraus. Auf einer Datei

    Der Speicherzuordnungsmechanismus mmap ist ein POSIX-Standardsystemaufruf. Es gibt zwei Arten der anonymen Zuordnung und der Dateizuordnung

    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.
      3.2 Mutex-Sperre
      • Jede Operation von Speicherressourcen beinhaltet den Sperrmechanismus.
      • Gemeinsamer Speicher: Nur ein Prozess darf Schreibvorgänge pro Zeiteinheit ausführen, und mehrere Prozesse dürfen Lesevorgänge ausführen.
      • Schreibvorgänge werden gleichzeitig ausgeführt und Lesevorgänge werden nicht blockiert, sodass dort keine Blockierung erfolgt Es kommt selten zu einer Sperrsituation.
      • Dies führt zu einem weiteren Problem: Neuer Code, große Datenverkehrsszenarien, Prozesse, die in der Warteschlange stehen, um Cache-Opcode-Vorgänge auszuführen, führen zu einer Verschwendung von Ressourcen.
      • 4. OPCache-Cache-Interpretation
    • OPCache ist die offizielle Opcode-Cache-Lösung. Nach der PHP5.5-Version wurde sie in den PHP-Quellcode gepackt und gemeinsam veröffentlicht.
    • Es speichert den durch die PHP-Kompilierung generierten Bytecode und die Daten im gemeinsamen Speicher. Bei jeder Anfrage wird der kompilierte Opcode direkt aus dem Cache gelesen und ausgeführt.
    Verbessern Sie die Laufeffizienz von PHP, indem Sie den Skriptkompilierungsprozess speichern.

    Wenn Sie die APC-Erweiterung verwenden, um die gleiche Aufgabe zu erledigen, wird jetzt dringend empfohlen, stattdessen OPCache zu verwenden, insbesondere in PHP7.

    4.1 OPCode-Cache

    Opcache speichert OPCode und den folgenden Inhalt:

    • Funktion im PHP-Skript
    • Klasse im PHP-Skript definiert
    • Pfad der PHP-Skriptdatei
    • PHP-Skript OPArray
    • eigene Struktur/Inhalt des PHP-Skripts

    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.

    5. OPCache-Update-Strategie

    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?

    • Geben Sie während Spitzenzeiten keinen Code frei , dies ist eine Regel, die unter allen Umständen befolgt werden muss
    • Code-Aufwärmphase, z. B. die Verwendung von Skripten zur Stapelanpassung von PHP-Zugriffs-URLs oder die Verwendung von APIs, die von bereitgestellt werden OPCache wie opcache_compile_file () Kompilierungs-Caching durchführenopcache_compile_file() 进行编译缓存

    6. OPCache 的配置

    6.1 内存配置

    • opcache.preferred_memory_model="mmap" OPcache 首选的内存模块。如果留空,OPcache 会选择适用的模块, 通常情况下,自动选择就可以满足需求。可选值包括: mmapshm, 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 表示缓存全部文件。默认值0

    6.3 注释相关的缓存

    • opcache.load_comments boolean 如果禁用,则即使文件中包含注释,也不会加载这些注释内容。 本选项可以和 opcache.save_comments 一起使用,以实现按需加载注释内容。
    • opcache.fast_shutdown
    6. OPCache-Konfiguration

    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.

    Empfohlenes Lernen: „
  • PHP-Video-Tutorial🎜“🎜🎜🎜🎜

    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!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:awaimai.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen