PHP ist eine interpretierte Sprache. Ihr Ausführungsprozess muss zuerst in Zwischencode kompiliert und dann zur Ausführung über eine bestimmte virtuelle Maschine in spezifische Anweisungen übersetzt werden. Der Ausführungsprozess ist wie folgt: PHP 代码 => Token => 抽象语法树 => Opcodes => 执行
Der Inhalt jedes Schritts ist wie folgt:
Der Quellcode erhält ein Token durch lexikalische Analyse. Token ist eine aussagekräftige Kennung, in die der PHP-Code eingeschnitten wird. PHP7 verfügt über insgesamt 137 Tokens, die in der Datei zend_lingual_parser.h definiert sind.
Token ist ein Wortblock, aber ein einzelner Wortblock kann keine vollständige Semantik ausdrücken, und für die Organisation und Verbindung sind bestimmte Regeln erforderlich. Daher muss der Parser das Token entsprechend der Grammatik abgleichen und die Token verketten. Das Produkt, nachdem der Syntaxanalysator die Token verkettet, ist ein abstrakter Syntaxbaum (AST).
Sie müssen den Syntaxbaum in Opcode konvertieren, bevor er direkt von der Engine ausgeführt werden kann.
opcodes ist eine Sammlung von Opcodes, bei denen es sich um Zwischencodes während der PHP-Ausführung handelt. Eine der gebräuchlichsten PHP-Engineering-Optimierungsmaßnahmen ist „Turn on Opcache“, was sich auf die Technologie zum Zwischenspeichern von Opcodes bezieht. Durch den Wegfall der Phase vom Quellcode zum Opcode führt die Engine den zwischengespeicherten Opacode direkt aus, um die Leistung zu verbessern.
Lexikalische/grammatische Analyse, AST-Kompilierung und Opcode-Ausführung sind alle in der Zend-Engine implementiert. Darüber hinaus werden das Variablendesign, die Speicherverwaltung, die Prozessverwaltung usw. von PHP auch auf der Engine-Ebene implementiert.
zend-Engine bietet grundlegende Funktionen für PHP, während Interaktionen von außen über die PHP-Schicht abgewickelt werden müssen.
Abkürzung für Server-API, die die CLI-SAPI und die FPM-SAPI der Szene enthält. Externe Module können mit PHP interagieren, solange sie sich an das definierte SAPI-Protokoll halten.
kann basierend auf den Kernfunktionen und Schnittstellenspezifikationen der Zend-Engine entwickelt und erweitert werden.
Die Hauptquellverzeichnisse von PHP 7 sind: sapi, Zend, main, ext und TSRM. Das
Sapi-Verzeichnis
Das Sapi-Verzeichnis ist eine Abstraktion der Eingabe- und Ausgabeebenen und die Spezifikation für PHP zur Bereitstellung externer Dienste.
Mehrere häufig verwendete SAPIs:
1) Apache2handler: Apache-Erweiterung, kompiliert, um eine dynamische Linkbibliothek zu generieren, konfiguriert unter Apache. Wenn eine HTTP-Anfrage an Apache vorliegt, wird diese dynamische Linkbibliothek entsprechend der Konfiguration aufgerufen, um den PHP-Code auszuführen und die Interaktion mit PHP abzuschließen.
2) cgi-fcgi: Nach der Kompilierung wird ein ausführbares Programm generiert, das das CGI-Protokoll unterstützt. Der Webserver (z. B. NGINX) leitet die Anforderung über das CGI-Protokoll an den CGI-Prozess weiter Anfrage und gibt das Ausführungsergebnis an den Webserver zurück.
3) fpm-fcgi: fpm ist der FastCGI-Prozessmanager. Am Beispiel des NGINX-Servers: Wenn eine Anfrage an den NGINX-Server gesendet wird, übergibt NGINX die Anfrage gemäß dem FastCGI-Protokoll an den PHP-FPM-Prozess.
4) cli: Die interaktive Befehlszeilenschnittstelle von PHP.
Zend-Verzeichnis.
Zend-Verzeichnis ist der Kerncode von PHP. Speicherverwaltung, Speicherbereinigung, Prozessverwaltung, Variablen, Array-Implementierung usw. in PHP befinden sich alle im Quellcode dieses Verzeichnisses.
Das Hauptverzeichnis ist der Klebstoff zwischen der SAPI-Schicht und der Zend-Schicht. Die Zend-Schicht implementiert die Kompilierung und Ausführung von PHP-Skripten, die Sapi-Schicht implementiert die Abstraktion von Eingabe und Ausgabe und das Hauptverzeichnis spielt eine verbindende Rolle zwischen ihnen. Darüber hinaus analysiert es die SAPI-Anfrage und analysiert die auszuführenden Skriptdateien und Parameter. Andererseits führt es die erforderliche Modulinitialisierung und andere Arbeiten durch, bevor die Zend-Engine aufgerufen wird.
ext ist ein Verzeichnis, das sich auf PHP-Erweiterungen bezieht. Hier werden häufig verwendete Array-, Str-, PDO- und andere Funktionsreihen definiert.
TSRM (Thread Safe Resource Manager) – Thread Safe Resource Manager wird verwendet, um die Sicherheit der Ressourcenfreigabe zu gewährleisten.