In diesem Artikel untersuchen wir, wie PHP-Code interpretiert und ausgeführt wird und den Lebenszyklus der Ausführung von PHP-Skripten.
Übersicht
Start des PHP-Dienstes. Streng genommen müssen PHP-bezogene Prozesse nicht manuell gestartet werden. Sie werden ausgeführt, wenn Apache gestartet wird. Wenn Sie den PHP-Dienst neu starten müssen, können Sie den PHP-Dienst natürlich auch manuell neu starten. Nachdem Sie beispielsweise den Code in einer formalen Umgebung mit aktiviertem Opcode aktualisiert haben, müssen Sie PHP neu starten, um den PHP-Code neu zu kompilieren.
Aus makroökonomischer Sicht besteht die Implementierung des PHP-Kernels darin, Eingabedaten zu empfangen, die entsprechende Verarbeitung intern durchzuführen und dann die Ergebnisse auszugeben. Für den PHP-Kernel handelt es sich bei dem von uns geschriebenen PHP-Code um die vom Kernel empfangenen Eingabedaten. Nach dem Empfang der Codedaten führt der PHP-Kernel eine Codeanalyse und Operationsausführung für den von uns geschriebenen Code durch und gibt schließlich das entsprechende Operationsergebnis zurück.
Im Gegensatz zum üblichen C-Sprachcode müssen Sie zum Ausführen von PHP-Code jedoch zunächst den PHP-Code in Maschinensprache „übersetzen“, um die entsprechende Funktion auszuführen. Um den Schritt „Übersetzung“ durchzuführen, muss der PHP-Kernel folgende Schritte ausführen: lexikalische Analyse, Syntaxanalyse und andere Schritte. Abschließend wird es zur sequentiellen Ausführung an die Zend Engine des PHP-Kernels übergeben.
Lexikalische Analyse
PHP-Code in „Einheiten“ (TOKEN) aufteilen
Syntaktische Analyse
„Einheiten“ in ausführbare Zend Engine-Operationen konvertieren
Zend Engine-Ausführung
Führen Sie die durch Syntaxanalyse erhaltenen Vorgänge nacheinander aus
Alle PHP-Programme (CGI/CLI) starten mit SAPI (Server Application Programming Interface). Die Schnittstelle wird gestartet. SAPI bezeichnet die Programmierschnittstelle für bestimmte PHP-Anwendungen. Zum Beispiel mod_php von Apache.
Nachdem PHP mit der Ausführung begonnen hat, durchläuft es zwei Hauptphasen: die Startphase vor der Verarbeitung der Anfrage und die Endphase nach der Anfrage.
Startphase
Die gesamte Startphase von PHP durchläuft zwei Phasen: Modulinitialisierung und Modulaktivierung.
MINIT
ist die Modulinitialisierungsphase, die während des gesamten Lebenszyklus nach dem Start von Apache/Nginx oder während der gesamten Ausführung des Befehlszeilenprogramms auftritt. Diese Phase wird nur einmal durchgeführt
RINIT
Die Modulaktivierung erfolgt während der Anforderungsphase. Führen Sie einige Initialisierungsarbeiten durch: z. B. das Registrieren von Konstanten, das Definieren der vom Modul verwendeten Klassen usw.
Wenn das Modul implementiert ist, können diese Rückruffunktionen über die folgenden Makros implementiert werden:
PHP_MINIT_FUNCTION(myphpextension) { //注册常量或者类等初始化操作 return SUCCESS; } PHP_RINIT_FUNCTION(myphpextension) { //例如记录请求开始时间 //随后在请求结束的时候记录结束时间。这样我们就能够记录处理请求所花费时间了 return SUCCESS; }
Nachdem die PHP-Skriptanforderung verarbeitet wurde, tritt sie in die Endphase ein. Im Allgemeinen tritt PHP in die Endphase ein, wenn das Skript bis zum Ende ausgeführt wird oder die Exit- oder Die-Funktion aufgerufen wird.
Endphase
Die Endphase von PHP gliedert sich in zwei Teile: Deaktivieren des Moduls und Schließen des Moduls.
RSHUTDOWN
Deaktivieren Sie das Modul (entsprechend RINIT)
MSHUTDOWN
Schließen Sie das Modul (entsprechend MINIT)
CLI/CGI-Modus PHP ist ein Single -Prozess-SAPI-Modell. Dies bedeutet, dass das PHP-Skript nach einmaliger Ausführung geschlossen wird und alle Variablen und Funktionen nicht mehr verwendet werden können. Das heißt, im CGI-Modus können Variablen derselben PHP-Datei nicht in anderen PHP-Dateien verwendet werden.
Schauen wir uns anhand eines Beispiels den SAPI-Lebenszyklus von Single-Threaded-PHP an.
Single-Threaded SAPI-Lebenszyklus
Zum Beispiel:
php -f test.php
Initialisierung jedes erweiterten MINIT-Moduls aufrufen
Test.php anfordern
Aufruf Aktivieren Sie jeweils das erweiterte RINIT-Modul.
Führen Sie test.php aus.
Rufen Sie RSHUTDOWN jeder Erweiterung auf, um das Modul zu deaktivieren.
Bereinigen Sie die Variablen und den Speicher nach der Ausführung von test.php.
Rufen Sie MSHUTDOWN jeder Erweiterung auf Schließen Sie das Modul
Stoppen Sie die PHP-Ausführung
Das Obige ist ein einfacher Ausführungsprozess, und einige Ergänzungen werden unten vorgenommen.
Bevor die Modulinitialisierung jedes Moduls aufgerufen wird, führt PHP einen Initialisierungsprozess durch, der Folgendes umfasst:
Initialisierung mehrerer globaler Variablen
In den meisten Fällen werden sie auf NULL gesetzt.
Mehrere Konstanten initialisieren
Die Konstanten hier sind einige von PHPs eigenen Konstanten.
Zend-Engine und Kernkomponenten initialisieren
Zu den Initialisierungsvorgängen gehören die Initialisierung der Speicherverwaltung, die Initialisierung globaler Funktionszeiger, die lexikalische Analyse, die Syntaxanalyse von PHP-Quelldateien und die Zuweisung von Funktionszeigern für die Zwischencodeausführung. Initialisieren Sie mehrere HashTables (z. B. Funktionstabellen, Konstantentabellen usw.), bereiten Sie sich auf das Parsen von INI-Dateien vor, bereiten Sie sich auf das Parsen von PHP-Quelldateien vor, registrieren Sie integrierte Funktionen, Standardkonstanten, globale GLOBALS-Variablen usw.
Parse php.ini
liest die Datei php.ini, legt Konfigurationsparameter fest, lädt die Zend-Erweiterung und registriert PHP-Erweiterungsfunktionen.
Initialisierung globaler Betriebsfunktionen
Initialisieren Sie einige globale Variablen, die häufig im Benutzerbereich verwendet werden, wie zum Beispiel: $_GET, $_POST, $_FILES usw.
Statisch erstellte Module und gemeinsam genutzte Module initialisieren (MINIT)
Standardmäßig geladene Module initialisieren.
Die Modulinitialisierung führt folgende Operationen aus:
Registrieren Sie das Modul in der Liste der registrierten Module.
Registrieren Sie die in jedem Modul enthaltenen Funktionen in der Funktionstabelle.
Deaktivieren Sie Funktionen und Klassen.
Die Die Funktion „zend_disable_function“ wird aufgerufen, um die durch die Variable „disable_functions“ in der PHP-Konfigurationsdatei dargestellte Funktion aus der CG-Funktionstabelle (function_table) zu löschen.
Zend-Engine aktivieren
Verwenden Sie die Funktion init_compiler, um den Compiler zu initialisieren.
SAPI aktivieren
Verwenden Sie die Funktion sapi_activate, um SG (sapi_headers) und SG (request_info) zu initialisieren und einige Inhalte für die HTTP-Anfragemethode festzulegen.
Umgebungsinitialisierung
Initialisieren Sie einige Umgebungsvariablen, die in Benutzersteuerelementen verwendet werden müssen. Einschließlich Serverumgebung, Anforderungsdatenumgebung usw.
Initialisierung der Modulanforderung
PHP ruft die Funktion zend_activate_modules auf, um alle in der Variablen module_registry registrierten Module zu durchlaufen, und ruft seine RINIT-Methode auf, um die Anforderungsinitialisierungsoperation des Moduls zu implementieren.
Nach der Verarbeitung des dateibezogenen Inhalts ruft PHP php_request_startup auf, um den Anforderungsinitialisierungsvorgang durchzuführen:
Zend-Engine aktivieren
SAPI aktivieren
Umgebungsinitialisierung
Modulanforderungsinitialisierung
Codeausführung
Nachdem alle oben genannten Vorbereitungen abgeschlossen sind, beginnt die Ausführung des PHP-Programms. PHP führt über zend_compile_file lexikalische Analysen, Syntaxanalysen und Zwischencode-Generierungsvorgänge durch und gibt alle Zwischencodes dieser Datei zurück. Wenn die analysierte Datei gültigen Zwischencode generiert, wird zend_excute aufgerufen, um den Zwischencode auszuführen. . Wenn bei der Ausführung Ausnahmen auftreten und der Benutzer die Behandlung dieser Ausnahmen definiert hat, werden diese Ausnahmebehandlungsfunktionen aufgerufen. Nachdem alle Vorgänge verarbeitet wurden, gibt PHP das Ergebnis über EG (return_value_ptr_ptr) zurück.
DEAKTIVIERUNG (Anfrage schließen)
Der Prozess des PHP-Schließens einer Anfrage besteht aus mehreren Schließvorgängen, und dieser Satz ist in der Funktion php_request_shutdown vorhanden. Dazu gehört:
Aufrufen aller über register_shutdown_function() registrierten Funktionen. Diese beim Herunterfahren aufgerufenen Funktionen wurden im Benutzerbereich hinzugefügt.
Wenn PHP einen Prozess beendet, ruft es die Funktion sapi_flush auf, um den letzten Inhalt zu löschen. Die Funktion zend_shutdown fährt die Zend-Engine herunter >Referenz: [http://www.php-internals.com/book/](http://www.php-internals.com/book/)
Führen Sie alle verfügbaren __destruct-Funktionen aus. Zu den Destruktoren gehören hier die Destruktoren aller Objekte im Objektpool (EG (objects_store)) und die Destruktormethoden jedes Elements in EG (symbol_table).
Alle Ausgaben löschen
Zerstören Sie die Variablen der globalen Variablentabelle (PG (http_globals)).
Schließen Sie den Lexer, den Parser und den Zwischencode-Executor über die Funktion zend_deactivate.
Rufen Sie grundsätzlich jeden erweiterten post_deactivate_func-Funktionszeiger auf ist NULL.
Schließen Sie den Inhalt von SG (sapi_headers), SG (request_info) usw.
Schließen Sie die Speicherverwaltung die maximale Ausführungszeit
Ende
Das Obige stellt vor, wie PHP funktioniert, einschließlich verschiedener Aspekte. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.