Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Gesamtrahmens des PHP7-Quellcodes

Detaillierte Erläuterung des Gesamtrahmens des PHP7-Quellcodes

coldplay.xixi
coldplay.xixiOriginal
2021-02-03 10:18:472457Durchsuche

Detaillierte Erläuterung des Gesamtrahmens des PHP7-Quellcodes

Empfohlen (kostenlos): PHP7

1. PHP7-Sprachausführungsprinzip

Es gibt viele häufig verwendete Hochsprachen, die je nach Art und Weise grob in zwei Typen unterteilt werden können Sie werden ausgeführt: Kompilierungstypsprache und interpretierte Sprache.

Kompilierung bezieht sich auf die „Übersetzung“ des Programmquellcodes in Assemblersprache vor der Ausführung des Anwendungsquellprogramms und die anschließende weitere Kompilierung in eine Zieldatei entsprechend der Software- und Hardwareumgebung. Das Tool, das die Kompilierungsarbeit abschließt, wird im Allgemeinen als Compiler bezeichnet.

Interpretierte Sprachen werden bei laufendem Programm in Maschinensprache „übersetzt“. Die „Übersetzung“ wird jedoch nur einmal durchgeführt, sodass die Ausführungseffizienz gering ist. Die Aufgabe des Interpreters ist das Programm, das für die „Übersetzung“ des Quellcodes in eine interpretierte Sprache verantwortlich ist.

Ein Teil des C-Sprachcodes muss vorkompiliert, kompiliert, assembliert und verknüpft werden, bevor er zu einer ausführbaren Binärdatei werden kann.

Kompilierte Sprachen, die durch die C-Sprache dargestellt werden, Codeaktualisierungen müssen die oben genannten Schritte durchlaufen.

Ausführungsdiagramm der kompilierten Sprache:

Das Verständnis des Unterschieds zwischen kompilierter Sprache und interpretierter Sprache basiert auf dem Zeitpunkt, zu dem der Quellcode in die CPU-Anweisungen der Zielplattform kompiliert wird. Bei kompilierten Sprachen handelt es sich bei den Kompilierungsergebnissen bereits um Anweisungen für das aktuelle CPU-System. Bei interpretierten Sprachen müssen sie zunächst in Zwischencode kompiliert und dann über die spezifische virtuelle Maschine der interpretierten Sprache in Anweisungen für ein bestimmtes CPU-System übersetzt werden Ausführung. Interpretierte Sprachen werden zur Laufzeit in Anweisungen für die Zielplattform übersetzt. Interpretierte Sprachen werden oft als „langsam“ bezeichnet, und das ist vor allem der Grund, warum sie langsam sind.

In PHP 7 wird der Quellcode zunächst einer lexikalischen Analyse unterzogen und der Quellcode in mehrere Zeichenfolgeneinheiten zerlegt. Die unterteilten Zeichenfolgen werden Token genannt. Jedes unabhängige Token kann keine vollständige Semantik ausdrücken. Es muss die Syntaxanalysephase durchlaufen, um das Token in einen abstrakten Syntaxbaum (AST) umzuwandeln. Anschließend wird der abstrakte Syntaxbaum zur Ausführung in Maschinenanweisungen umgewandelt. In PHP werden diese Anweisungen Opcodes genannt.

Schritt 1: Erhalten Sie das Token durch lexikalische Analyse des Quellcodes.

Schritt 2: Erstellen Sie einen abstrakten Syntaxbaum (AST) basierend auf dem Syntaxanalysator.

Schritt 3: Der abstrakte Syntaxbaum wird in Opcodes (Opcode-Befehlssatz) umgewandelt und PHP interpretiert die Opcodes und führt sie aus.

1. Token

Token ist eine aussagekräftige Kennung, in die der PHP-Code eingeschnitten wird. PHP stellt die Funktion token_get_all() bereit, um das Token zu erhalten, nachdem der PHP-Code ausgeschnitten wurde.

Der erste Wert jedes Mitgliedsarrays des zweidimensionalen Arrays ist der dem Token entsprechende Aufzählungswert. Der zweite Wert ist der ursprüngliche String-Inhalt, der dem Token entspricht. Der dritte Wert ist die Zeilennummer, die dem Code entspricht.

Es ist ersichtlich, dass Token nacheinander ein „Chunk“ ist, aber die einzelnen Chunks können keine vollständige Semantik ausdrücken und müssen mithilfe von Regeln organisiert und verbunden werden. Der Parser ist dieser Organisator. Die Syntax wird überprüft, das Token abgeglichen und das Token zugeordnet.

2.AST

AST ist eine neue Funktion der PHP 7-Version. In früheren Versionen gab es während der Ausführung von PHP-Code keinen Schritt zum Generieren von AST.

AST-Knoten sind entsprechend der PHP-Syntax in mehrere Typen unterteilt.

PHP-Parser-Tool, mit dem der von PHP-Code generierte AST angezeigt werden kann.

Hinweis: PHP-Parser ist ein von Nikic, einem der Autoren des PHP 7-Kernels, geschriebenes Tool zur Generierung von AST aus PHP-Quellcode. Der Quellcode ist unter https://github.com/nikic/PHP-Parser verfügbar.

3.opcodes

Opcode ist nur eine einzelne Anweisung. Opcodes sind eine Sammlung von Opcodes und der Zwischencode während der PHP-Ausführung. Nachdem der Opcode generiert wurde, wird er von der virtuellen Maschine ausgeführt.

Eine der häufigsten PHP-Engineering-Optimierungsmaßnahmen ist „Opcache einschalten“, was sich hier auf den Opcodes-Cache bezieht. Durch den Wegfall der Phase vom Quellcode zum Opcode kann die Engine den zwischengespeicherten Opcode direkt ausführen und dadurch

die Leistung verbessern.

Mit dem vld-Plug-in können Sie intuitiv den von einem PHP-Code generierten Opcode sehen.

Opcode ist ein Satz von Befehlsbezeichnern, die von PHP 7 definiert werden, und die Anweisungen entsprechen den entsprechenden Handlern (Verarbeitungsfunktionen). Wenn die virtuelle Maschine Opcode aufruft, findet sie die Verarbeitungsfunktion hinter dem Opcode und führt eine echte Verarbeitung durch.

2. Kernel-Architektur

Die Zend-Engine enthält einen Compiler und einen Interpreter. Vom PHP-Code bis zur Opcode-Ausführung wird alles von der Zend-Engine vervollständigt.

Zusätzlich zur Implementierung der Kernfunktionen von PHP bietet die Zend-Engine auch eine Reihe von Schnittstellen, die die Verwendung von PHP in weiteren Szenarien ermöglichen, z. B. in Befehlszeilenumgebungen, Webumgebungen usw.

Das Architekturdiagramm ist grob in vier Teile unterteilt.

1) Zend-Engine: Die oben eingeführte lexikalische/grammatikalische 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. Die Engine stellt grundlegende Dienste für PHP bereit. Die Zuverlässigkeit und hohe Leistung von PHP hängen von der grundlegenden Unterstützung der Engine ab. Gleichzeitig ist die Skalierbarkeit der Zend-Engine einer der wichtigen Gründe für die groß angelegte Anwendung von PHP.

2) PHP-Schicht: Die Zend-Engine bietet grundlegende Funktionen für PHP (wie Speicherzuweisung und -wiederverwendung), während Interaktionen von außen über die PHP-Schicht abgewickelt werden müssen.

3) SAPI: SAPI ist die Abkürzung für Server API, zu der die gängigen CLI-SAPI und FPM-SAPI gehören. PHP definiert Eingabe-/Ausgabespezifikationen, und die Partei, die gemäß dieser Spezifikation mit PHP interagiert, kann als Server bezeichnet werden.

4) Erweiterungsteil: Die Zend-Engine bietet Kernfunktionen und Schnittstellenspezifikationen. Die auf dieser Basis entwickelten Erweiterungen bieten umfassendere Optionen für die Leistung und Funktionsvielfalt von PHP-Code. 3. PHP-Quellcode-Verzeichnis

Die Eingabe in das PHP-Programm kann die Standardeingabe über die Befehlszeile oder eine Netzwerkanfrage basierend auf dem CGI/Fastcgi-Protokoll sein. Auf die gleiche Weise kann die Ausgabe in die Standardausgabe der Befehlszeile geschrieben oder als Netzwerkantwort basierend auf dem CGI/Fastcgi-Protokoll an den Client zurückgegeben werden.

Der Befehlszeilenmodus entspricht dem Binärprogramm bin/php; der integrierte Modulmodus muss kein Binärprogramm bereitstellen, er kann von Apache oder einem beliebigen C/C++-Programm aufgerufen werden; entspricht dem Binärprogramm bin/cgi; FastCGI-Modus entspricht dem Binärprogramm sbin/php-fpm. 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, PHP-Code ausgeführt und die Interaktion mit abgeschlossen PHP.

2) cgi-fcgi: Nach der Kompilierung wird ein ausführbares Programm generiert, das das CGI-Protokoll unterstützt. Der Webserver (normalerweise Apache oder Nginx) leitet die Anforderung über das CGI-Protokoll an den CGI-Prozess weiter und der Ausführungscode gibt das Ergebnis zurück den Webserver und beendet den Prozess.

3) fpm-fcgi: fpm steht für FastCGI Process Manager, den offiziell von PHP bereitgestellten FastCGI-Prozessmanager. Am Beispiel des Nginx-Servers: Wenn eine HTTP-Protokollanforderung an den Nginx-Server gesendet wird, übergibt Nginx die Anforderung an den PHP-FPM-Prozess zur Verarbeitung gemäß dem FastCGI-Protokoll.

4) cli: Abkürzung für Command Line Interface, die interaktive Befehlszeilenschnittstelle von PHP.

Quellcode des Zend-Verzeichnisses

Das Zend-Verzeichnis ist der Kerncode von PHP.

1. Speicherverwaltungsmodul

3. Array-Implementierung

Hauptverzeichnis-Quellcode

Das Hauptverzeichnis ist der Kleber zwischen der SAPI-Ebene und der Zend-Ebene.

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 dient als Verbindung zwischen dem Vorhergehenden und dem Folgenden: Verbinden des Vorhergehenden, Parsen der SAPI-Anfrage, Analysieren die auszuführenden Skriptdateien und Parameter. Schließen Sie als Nächstes die erforderliche Initialisierung und andere Arbeiten ab, bevor Sie die Zend-Engine aufrufen.

ext-Verzeichnis-Quellcode

ext ist ein Verzeichnis, das sich auf PHP-Erweiterungen bezieht. Hier werden häufig verwendete Array-, Str-, PDO- und andere Funktionsreihen definiert.

Quellcode des TSRM-Verzeichnisses

PHP wurde in den frühen Tagen größtenteils in einem Einzelprozess- und Einzelthread-Modell ausgeführt, und der Thread-Sicherheitsmechanismus ZTS (Zend Thread Safety) wurde später eingeführt.

TSRM ist die Abkürzung für Thread Safe Resource Manager – Thread Safe Resource Manager.

Der Thread-Sicherheitsmechanismus dient hauptsächlich dazu, die Sicherheit gemeinsam genutzter Ressourcen zu gewährleisten. Der Thread-Sicherheitsmechanismus von PHP ist einfach und intuitiv – in einer Multithread-Umgebung wird für jeden Thread eine unabhängige Kopie globaler Variablen bereitgestellt. Die spezifische Implementierung besteht darin, jedem Thread über TSRM eine unabhängige ID (vor der Zuweisung sperren) als globalen Variablenspeicherbereichsindex des aktuellen Threads zuzuweisen. Beim zukünftigen Zugriff auf globale Variablen wird eine vollständige Unabhängigkeit zwischen Threads erreicht.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Gesamtrahmens des PHP7-Quellcodes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn