Heim  >  Artikel  >  Backend-Entwicklung  >  Wie ist die Zusammensetzung und der Lebenszyklus von PHP?

Wie ist die Zusammensetzung und der Lebenszyklus von PHP?

慕斯
慕斯nach vorne
2021-06-23 14:02:152705Durchsuche

Wir haben so viel über PHP gelernt. Ich frage mich, ob Sie die Zusammensetzung und den Lebenszyklus vollständig verstanden haben. Wenn nicht, folgen Sie diesem Artikel, um weiterzulernen. 1. Download-Adresse für PHP-Open-Source-Quellcode:

https://github.com/php/php-src.git
2. Die Struktur von PHP

1. Verzeichnisstruktur

2. Verzeichnisanalyse

Das Verzeichnis ist die Anwendungsschnittstellenschicht von PHP.

(2) Main ist der Hauptcode von PHP, hauptsächlich Eingabe/Ausgabe, Webkommunikation, Initialisierungsvorgänge des PHP-Frameworks usw., wie Fastcgi-Protokollanalyse, Laden von Erweiterungen, PHP-Konfigurationsanalyse und andere Arbeiten.

(3) Das Zend-Verzeichnis ist die Hauptimplementierung des PHP-Parsers, nämlich ZendVM, die Kernimplementierung der PHP-Sprache. Die Interpretation und Ausführung von PHP-Code wird von Zend vervollständigt.

(4) Das ext-Verzeichnis ist das Erweiterungsverzeichnis von PHP, z. B. die Curl-Erweiterung von PHP, die GD-Bibliothekserweiterung, die PDO-Erweiterung usw. sind alle hier.

(5) Das TSRM-Verzeichnis ist eine Implementierung im Zusammenhang mit der Thread-Sicherheit.

(6) Beziehungsdiagramm zwischen den verschiedenen Komponenten von PHP:

3, SAPI

(1) PHP ist ein Skriptparser, der das Parsen und Ausführen von Skripten ermöglicht. Seine Eingabe ist gewöhnlicher Text, der dann vom PHP-Parser gemäß vordefinierten Grammatikregeln analysiert und ausgeführt wird. Wir können diesen Parser in verschiedenen Umgebungen anwenden, z. B. in der Befehlszeile, in der Webumgebung, und ihn in andere Anwendungen einbetten. Zu diesem Zweck stellt PHP eine SAPI-Schicht zur Anpassung an verschiedene Anwendungsumgebungen bereit. SAPI kann als Host-Umgebung von PHP betrachtet werden.

(2) SAPI ist auch der äußerste Teil des gesamten PHP-Frameworks. Es ist hauptsächlich für die Initialisierung des PHP-Frameworks verantwortlich. Der SAPI-Code befindet sich im Verzeichnis /sapi des PHP-Quellcodes. Die beiden häufig verwendeten SAPIs sind Cli und Fpm.

4. ZendVM

(1) ZendVM ist ein virtueller Computer, der zwischen PHP-Anwendungen und tatsächlichen Computern liegt. Der von uns geschriebene PHP-Code wird von ihm interpretiert und ausgeführt. ZendVM ist die Kernimplementierung der PHP-Sprache. Sie besteht hauptsächlich aus zwei Teilen: Compiler und Executor.

(2) Der Compiler ist dafür verantwortlich, PHP in Anweisungen zu interpretieren, die vom Executor erkannt werden können, und der Executor ist für die Ausführung der vom Compiler interpretierten Anweisungen verantwortlich.

(3) Die Rolle von ZendVM entspricht der der JVM in Java. Beide sind abstrahierte virtuelle Computer.

5. Erweiterung

(1) Eine Erweiterung ist eine Reihe von Möglichkeiten, die der PHP-Kernel zur Erweiterung von PHP-Funktionen bietet. Diese Erweiterungen bieten PHP eine große Anzahl praktischer Funktionen Funktionen: Viele Bedienfunktionen in PHP werden durch Erweiterungen bereitgestellt.

(2) Durch Erweiterung können wir C/C++ verwenden, um leistungsfähigere Funktionen und eine höhere Leistung zu erreichen. Erweiterungen werden in PHP-Erweiterungen und Zend-Erweiterungen unterteilt, während Zend-Erweiterungen hauptsächlich in ZendVM verwendet werden. Der bekannte Opcache ist die Zend-Erweiterung.

3. PHP-Lebenszyklus

1. Der gesamte Lebenszyklus von PHP ist in die folgenden Phasen unterteilt:

(1) Modulinitialisierungsphase (Modulstart)

(2) Anforderungsinitialisierungsphase (Anforderungsstart)

(3) Skriptausführungsphase (execute script)

(4) Request Shutdown-Phase (Request Shutdown)

(5) Modul Shutdown-Phase (Modul Shutdown)

Hinweis: Abhängig von der Implementierung unterschiedlicher SAPI ist die Ausführung unterschiedlich In jeder Phase gibt es einige Unterschiede in der Situation. Beispielsweise durchläuft ein Skript im Befehlszeilenmodus jedes Mal diese Phasen. Im FastCgi-Modus wird die Modulinitialisierung einmal beim Start durchgeführt, und dann durchläuft jede Anforderung nur die Phasen der Anforderungsinitialisierung, der Skriptausführung und des Schließens der Anforderung. Wenn SAPI geschlossen wird, durchläuft sie nur die Phase des Schließens des Moduls.

2. Modulinitialisierungsphase – Analyse

(1) In dieser Phase werden hauptsächlich die Initialisierungsvorgänge des PHP-Frameworks und der Zend-Engine ausgeführt. Die Einstiegsfunktion dieser Stufe ist php_module_startup(). Diese Phase wird im Allgemeinen nur einmal beim Start von SAPI ausgeführt. Bei Fpm wird sie ausgeführt, wenn der Masterprozess von Fpm startet.

(2) Mehrere Hauptprozesse in dieser Phase sind wie folgt:

(3) SAPI aktivieren: sapi_activate(), Anforderungsinformation SG (request_info) initialisieren, Handle zum Lesen von POST-Anfragen festlegen usw.

(4) Starten Sie die PHP-Ausgabe: php_output_startup()

(5) Initialisieren Sie den Garbage Collector: gc_globals_ctor() und weisen Sie zend_gc_globals Speicher zu. (6) Starten Sie die ZEND-Engine: zend_startup().

(6.2) Legen Sie einige util-Funktionshandles fest, z. B. zend_error_cb, zend_pringf, zend_write usw.

(6.3) Legen Sie die Zend-Kompilierungs- und Executor-Funktionshandles zend_compile_file, zend_execute_ex und das Garbage-Collect-Funktionshandle gc_collect_cycles fest.

(6.4) Weisen Sie Funktionssymboltabelle, Methodensymboltabelle (function_table), Klassensymboltabelle (class_table) und zu Konstantensymbole Tabelle (zend_constants) usw. Wenn es sich um Multithreading handelt, werden auch globale Variablen des Compilers und Executors zugewiesen.

(6.5) Zend-Kernerweiterung registrieren: zend_startup_builtin_funtions(), diese Erweiterung wird vom Kernel bereitgestellt. Dieser Prozess registriert die von der Zend-Kernerweiterung bereitgestellten Funktionen, wie z. B. strlen, define, func_get_args, class_exists usw.

(6.6) Registrieren Sie die von Zend definierten Standardkonstanten: zend_register_standard_constants(), wie E_ERROR, E_WARNING, E_ALL, TRUE, FALSE usw.

(6.7) Registrieren Sie das Erfassungshandle der superglobalen Variablen $GLOBALS.

(6.8) Ordnen Sie die in php.ini konfigurierte Speichersymboltabelle EG (ini_directives) zu.

(7) Registrieren Sie die von PHP definierten Konstanten: PHP_VERSION, PHP_ZTS, PHP_SAPI usw.

(8) php.ini analysieren: Nach Abschluss des Parsens werden alle php.ini-Konfigurationen in der Hash-Tabelle „configuration_hash“ gespeichert.

(9) Zuordnung der php.ini-Konfiguration von PHP und Zend Core: Erhalten Sie den entsprechenden Konfigurationswert basierend auf der analysierten php.ini und fügen Sie die endgültige Konfiguration in die EG-Hash-Tabelle (ini_directives) ein.

(10) Registrieren Sie Handles zum Erhalten der Variablen $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_REQUEST, $_FILES.

(11) Registrieren Sie statisch kompilierte Erweiterungen: php_register_internal_extensions_func().

(12) Registrieren Sie dynamisch geladene Erweiterungen: php_init_register_extensions(), laden Sie die in php.ini konfigurierten Erweiterungen in PHP.

(13) Rufen Sie die von jeder Erweiterung definierte Modul-Start-Hook-Funktion zurück, d. h. die durch PHP_MINIT_FUNCTION() definierte Funktion.

(14) Registrieren Sie deaktivierte Funktionen und Klassen in php.ini: DISABLE_FUNSTIONS, DISABLE_ClassES.

3. Anfrageinitialisierungsphase – Analyse

Diese Phase durchläuft jede Anfrage vor der Anfragebearbeitung. Bei fpm handelt es sich um eine Phase, nachdem der Arbeitsprozess eine Anfrage akzeptiert und die Anfragedaten abruft und analysiert. Die Verarbeitungsfunktion in dieser Phase ist php_request_startup().

Die Hauptverarbeitung ist wie folgt:

(1) Ausgabe aktivieren: php_output_activate()

(2) Zend-Engine aktivieren: zend_activate(), die Hauptoperationen sind

(2.1) Zurücksetzen des Garbage Collectors: gc_reset()

​ (2.2) Initialisieren Sie den Compiler: ini_compiler()

​ ​ (2.3) Initialisieren Sie den Executor: ini_exexutor(), führen Sie CG (function_table) und CG (class_table) jeweils für EG (function_table) und EG (class_table) aus.

(2.4) Globale Variablensymboltabelle EG (symbol_table) initialisieren, enthaltene Dateisymboltabelle EG (included_files)

(2.5) Lexikalischer Scanner initialisieren: sapi_activate()

(3) SAPI aktivieren: sapi_activate()

(4 ) Rufen Sie eine erweiterte Definition der Request-Startup-Hook-Funktion auf: zend_activate_modules()

4 Skriptausführungsphase – Analyse

(1) Diese Phase umfasst die beiden Kernphasen der Kompilierung und Ausführung von PHP-Code, was auch die wichtigste ist wichtige Phase der Zend-Engine.

(2) Während der Kompilierungsphase durchläuft das PHP-Skript den Konvertierungsprozess vom PHP-Quellcode in einen abstrakten Syntaxbaum und dann in Opline-Anweisungen. Die endgültig generierten Opline-Anweisungen sind Ausführungsanweisungen, die von der Zend-Engine erkannt werden können , und diese Anweisungen werden vom Executor ausgeführt. Dies ist der Prozess der Interpretation und Ausführung von PHP-Code. Die Einstiegsfunktion dieser Stufe ist php_execute_script().

5. Anforderungsabschlussphase – Analyse

(1) In dieser Phase wird der Ausgabeinhalt geleert, HTTP-Antwortheader gesendet, lokale Variablen bereinigt, der Compiler geschlossen, der Executor geschlossen usw.

(2) Darüber hinaus wird in dieser Phase die Request-Shutdown-Hook-Funktion jeder Erweiterung zurückgerufen.

(3) Diese Phase ist das Gegenteil der Anforderungsinitialisierungsphase.

6. Modul-Shutdown-Phase – Analyse

Diese Phase wird ausgeführt, wenn SAPI geschlossen wird und der Modulinitialisierungsphase entspricht. Sie bereinigt hauptsächlich Ressourcen und schließt gleichzeitig die Modul-Shutdown-Hook-Funktion jeder Erweiterung werde zurückgerufen.

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWie ist die Zusammensetzung und der Lebenszyklus von PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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