Heim  >  Artikel  >  Backend-Entwicklung  >  Ein Artikel, der das Prinzip und die Verwendung von PHP Opcache ausführlich erklärt

Ein Artikel, der das Prinzip und die Verwendung von PHP Opcache ausführlich erklärt

藏色散人
藏色散人nach vorne
2023-03-22 16:18:452065Durchsuche

本篇文章给大家带来了关于PHP opcache的相关知识,其中主要给大家聊一聊如何理解 OPCache 功能,并且如何使用它,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。

Ein Artikel, der das Prinzip und die Verwendung von PHP Opcache ausführlich erklärt

PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。
而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显。

1、概述

在理解 OPCache 功能之前,我们有必要先理解PHP-FPM + Nginx 的工作机制,以及PHP脚本解释执行的机制。 

1.1 PHP-FPM + Nginx 的工作机制

请求从Web浏览器到Nginx,再到PHP处理完成,一共要经历如下五个步骤:
第一步:启动服务

  • 启动PHP-FPM。PHP-FPM 支持两种通信模式:TCP socket和Unix socket;

  • PHP-FPM 会启动两种类型的进程:Master 进程 和 Worker 进程,前者负责监控端口、分配任务、管理Worker进程;后者就是PHP的cgi程序,负责解释编译执行PHP脚本。

  • 启动Nginx。首先会载入 ngx_http_fastcgi_module 模块,初始化FastCGI执行环境,实现FastCGI协议请求代理

  • 这里要注意:fastcgi的worker进程(cgi进程),是由PHP-FPM来管理,不是Nginx。Nginx只是代理

第二步:Request => Nginx

  • Nginx 接收请求,并基于location配置,选择一个合适handler

  • 这里就是代理PHP的 handler

第三步:Nginx => PHP-FPM

  • Nginx 把请求翻译成fastcgi请求

  • 通过TCP socket/Unix Socket 发送给PHP-FPM 的master进程

第四步:PHP-FPM Master => Worker

  • PHP-FPM master 进程接收到请求

  • 分配Worker进程执行PHP脚本,如果没有空闲的Worker,返回502错误

  • Worker(php-cgi)进程执行PHP脚本,如果超时,返回504错误

  • 处理结束,返回结果

第五步:PHP-FPM Worker => Master => Nginx

  • PHP-FPM Worker 进程返回处理结果,并关闭连接,等待下一个请求

  • PHP-FPM Master 进程通过Socket 返回处理结果

  • Nginx Handler顺序将每一个响应buffer发送给第一个filter → 第二个 → 以此类推 → 最终响应发送给客户端

1.2 PHP脚本解释执行的机制

了解了PHP + Nginx 整体的处理流程后,我们接下来看一下PHP脚本具体执行流程,首先我们看一个实例:

<p><?php   <br>    if (!empty($_POST)) {<br>        echo "Response Body POST: ", json_encode($_POST), "\n";<br>    }<br>    if (!empty($_GET)) {    <br>        echo "Response Body GET: ", json_encode($_GET), "\n";<br>    }<br></p>

我们分析一下执行过程:
1.php初始化执行环节,启动Zend引擎,加载注册的扩展模块
2.初始化后读取脚本文件,Zend引擎对脚本文件进行词法分析(lex),语法分析(bison),生成语法树
3.Zend 引擎编译语法树,生成opcode,
4.Zend 引擎执行opcode,返回执行结果

在PHP cli模式下,每次执行PHP脚本,四个步骤都会依次执行一遍;
在PHP-FPM模式下,步骤1)在PHP-FPM启动时执行一次,后续的请求中不再执行;步骤2)~4)每个请求都要执行一遍;
其实步骤2)、3)生成的语法树和opcode,同一个PHP脚本每次运行的结果都是一样的,在PHP-FPM模式下,每次请求都要处理一遍,是对系统资源极大的浪费,那么有没有办法优化呢?
当然有,如:

  • OPCache:前身是Zend Optimizer+ ,是 Zend Server 的一个开源组件;官方出品,强力推荐

  • APC:Alternative PHP Cache 是一个开放自由的 PHP opcode 缓存组件,用于缓存、优化 PHP 中间代码;已经不更新了不推荐

  • APCu:是APC的一个分支,共享内存,缓存用户数据,不能缓存opcode,可以配合Opcache 使用

  • eAccelerate:同样是不更新了,不推荐

  • xCache:不再推荐使用了

2. OPCache 介绍

OPCache 是Zend官方出品的,开放自由的 opcode 缓存扩展,还具有代码优化功能,省去了每次加载和解析 PHP 脚本的开销。PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。 
缓存两类内容:

  • OPCode

  • Interned String,如注释、变量名等

3 . OPCache 原理

OPCache缓存的机制主要是:将编译好的操作码放入共享内存,提供给其他进程访问。这里就涉及到内存共享机制,另外所有内存资源操作都有锁的问题,我们一一解读。 

3.1 共享内存

UNIX/Linux-Systeme bieten viele Möglichkeiten, Speicher zwischen Prozessen zu teilen:

1. System-V-Shm-API: System-V-Shm-Speicher ist dauerhaft, sofern er nicht explizit von einem Prozess gelöscht wird , bis das System heruntergefahren wird;
2.mmap API:

  • Der von mmap zugeordnete Speicher ist nicht dauerhaft. Wenn der Prozess heruntergefahren wird, wird die Zuordnung ungültig, es sei denn, sie wurde zuvor einer Datei zugeordnet.

  • Der Speicherzuordnungsmechanismus mmap ist ein POSIX-Standardsystemaufruf. Es gibt zwei Arten: anonyme Zuordnung und Dateizuordnung. Einer der Vorteile von mmap besteht darin, dass die Datei dem Adressraum des Prozesses zugeordnet wird von Daten aus dem Benutzerpuffer in den Kernel-Seitencache

  • Ein weiterer Vorteil ist natürlich, dass keine häufigen Lese-/Schreib-Systemaufrufe erforderlich sind

  • 3.

    Der gemeinsam genutzte Speicher von System V ist veraltet. Der gemeinsam genutzte POSIX-Speicher ermöglicht die Verwendung einer einfacheren und rationaler gestalteten API Modus. Gemäß dem PHP-Bytecode-Caching-Szenario ist das Speicherverwaltungsdesign von OPCache sehr einfach: Schnelles Lesen und Schreiben, keine Speicherfreigabe und abgelaufene Daten werden 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, während Schreibvorgänge ausgeführt werden. Lesevorgänge werden nicht blockiert, sodass es selten zu einer Sperrsituation kommt .
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 Anforderung 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:

Im PHP-Skript enthaltene Funktion


Im PHP-Skript definierte Klasse

PHP-Skriptdateipfad

  • PHP-Skript. OPArray

  • Eigene Struktur/Inhalt des PHP-Skripts

  • 4.2 Interned String

  • Caching Zuerst müssen wir verstehen, was ein Interned String ist.
  • In PHP5.4 wurde der Interned String-Mechanismus eingeführt, um die Speicherung und Verarbeitung von Strings durch PHP zu optimieren. Insbesondere beim Umgang mit großen String-Blöcken, wie z. B. PHP-Dokumenten, kann Interned String den Speicher optimieren. Zu den Inhalten des Caches für interne Zeichenfolgen gehören: 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: Bei der PHP-Entwicklung gibt es meist große Kommentarabschnitte, die auch im OPCache zwischengespeichert werden. Das Zwischenspeichern von Kommentaren kann über die Konfiguration von php.ini ausgeschaltet werden.

    Allerdings wird in Frameworks wie dem Zend Framework auf Annotationen verwiesen, sodass die Frage, ob das Caching von Annotationen deaktiviert werden soll, anders gehandhabt werden muss.

5. OPCache-Update-Strategie

ist ein Cache, der Ablauf- und Update-Strategien hat. Die Aktualisierungsstrategie von OPCache ist sehr einfach. Die abgelaufenen Daten werden auf „Verschwendet“ gesetzt. Wenn der eingestellte Wert erreicht ist, wird der Cache geleert und der Cache 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. Stellen Sie daher die Ablaufzeit des OPCache nicht ein

Jedes Mal, wenn neuer Code veröffentlicht wird, 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 zum stapelweisen Anpassen von PHP-Zugriffs-URLs oder die Verwendung von APIs, die von bereitgestellt werden OPCache wie opcache_compile_file() für den Kompilierungs-Cache


6. OPCache-Konfiguration

  • 6.1 Speicherkonfiguration

  • opcache.preferred_memory_model="mmap" OPcaches 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 Gemeinsame Speichergröße von OPcache, in Megabyte, Standard 64M

opcache.interned_strings_buffer=4 Speichergröße zum Speichern temporärer Zeichenfolgen, 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. Standard 5

6.2 Anzahl und Größe der Dateien, die zwischengespeichert werden dürfen

  • opcache.max_accelerated_files=2000 Die Obergrenze der Anzahl von Skriptdateien, die in der OPcache-Hash-Tabelle gespeichert werden können. Der reale Wert ist die erste Primzahl im Primzahlensatz {223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987}, die größer oder gleich dem eingestellten Wert ist. Der minimale Wertebereich des Einstellwerts beträgt 200, der maximale Wert beträgt 100000 vor PHP 5.5.6 und 1000000 nach PHP 5.5.6. Standardwert 2000

  • opcache.max_file_size=0 Maximale zwischengespeicherte Dateigröße in Bytes. Auf 0 setzen, um alle Dateien zwischenzuspeichern. Standardwert 0

6.3 Kommentarbezogener Cache

  • opcache.load_commentsboolean Wenn deaktiviert, wird der Kommentarinhalt nicht geladen, auch wenn die Datei Kommentare enthält. Diese Option kann zusammen mit opcache.save_comments verwendet werden, um Kommentarinhalte bei Bedarf zu laden.

  • opcache.fast_shutdown boolean Wenn aktiviert, werden Schnellstopp-Wiederaufnahmeereignisse 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 Second-Level-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_onlyboolean Opcode-Caching im gemeinsam genutzten Speicher aktivieren oder deaktivieren.

  • opcache.file_cache_consistency_checksboolean Ob die Prüfsumme der Datei überprüft werden soll, wenn das Skript aus dem Dateicache geladen wird.

  • opcache.file_cache_fallbackboolean Wenn auf Windows-Plattformen ein Prozess nicht an den gemeinsam genutzten Speicher angehängt werden kann, wird dateibasiertes Caching verwendet, das heißt: opcache.file_cache_only=1. Erforderlich, um das Datei-Caching zu aktivieren.

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonEin Artikel, der das Prinzip und die Verwendung von PHP Opcache ausführlich erklärt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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