Heim > Artikel > Backend-Entwicklung > (PHP7-Kernel-Analyse-1) CGI und FastCGI
CGI: Es ist ein Protokoll für den Datenaustausch zwischen Webserver und Webanwendung.
FastCGI: Wie CGI handelt es sich um ein Kommunikationsprotokoll, das jedoch einige Effizienzoptimierungen aufweist als CGI.
PHP-CGI: Es handelt sich um das Schnittstellenprogramm von PHP (Webanwendung) zum vom Webserver bereitgestellten CGI-Protokoll.
PHP-FPM: Es handelt sich um ein Schnittstellenprogramm für das von PHP (Webanwendung) bereitgestellte FastCGI-Protokoll. Darüber hinaus bietet es auch eine relativ intelligente Aufgabenverwaltung
CGI-Workflow
1. Wenn der Client index.html anfordert, findet der Webserver diese Datei im Dateisystem und sendet sie an den Browser.
2. Wenn der Webserver die index.php-Anfrage empfängt, startet er das entsprechende CGI-Programm, das den PHP-Parser darstellt. Als nächstes analysiert der PHP-Parser die Datei php.ini, initialisiert die Ausführungsumgebung, verarbeitet dann die Anforderung, gibt das verarbeitete Ergebnis in dem von CGI angegebenen Format zurück, beendet den Prozess und der Webserver gibt das Ergebnis an den Browser zurück.
FastCGI-Workflow
1. Wenn der Client index.html anfordert, findet der Webserver diese Datei im Dateisystem und sendet sie an den Browser Hier werden statische Daten verteilt.
2. Wenn der Webserver die Anforderung für index.php empfängt, wählt das FastCGI-Programm (FastCGI initialisiert die Ausführungsumgebung beim Start und jeder CGI-Prozesspool teilt sich die Ausführungsumgebung) im CGI-Prozesspool a Der CGI-Prozess verarbeitet die Anforderung, gibt das verarbeitete Ergebnis in dem von CGI angegebenen Format zurück und wartet weiter auf die nächste Anforderung.
Grundlegende Implementierung von PHP-FPM
1. Die Implementierung von PHP-FPM besteht darin, einen Master-Prozess zu erstellen, einen Worker-Pool im Master-Prozess zu erstellen und ihn zuzulassen Hören Sie auf den Socket und forken Sie dann mehrere Unterprozesse, und jeder dieser Unterprozesse akzeptiert die Anforderung. Die Verarbeitung des Unterprozesses ist sehr einfach. Wenn eine Anforderung eintrifft, wird sie blockiert. Er beginnt mit dem Lesen der Anforderungsdaten, beginnt mit der Verarbeitung und kehrt dann zurück. In diesem Zeitraum werden keine weiteren Anforderungen empfangen, was bedeutet, dass der Unterprozess von PHP-FPM jeweils nur auf eine Anforderung antworten kann Erst nachdem diese Anfrage verarbeitet wurde, wird die nächste Anfrage angenommen.
2 Es gibt keine direkte Kommunikation zwischen dem PHP-FPM-Masterprozess und dem Workerprozess Gemeinsamer Speicher, z. B. der aktuelle Status des Arbeitsprozesses, die Anzahl der verarbeiteten Anforderungen usw. Wenn der Masterprozess einen Arbeitsprozess beenden möchte, benachrichtigen Sie den Arbeitsprozess durch Senden eines Signals.
3.PHP-FPM kann mehrere Ports gleichzeitig überwachen. Jeder Port entspricht einem Worker-Pool und jeder Pool entspricht mehreren Worker-Prozessen
Worker-Workflow
1 Warten auf die Anfrage: Der Worker-Prozess ist in fcgi_accept_request() blockiert und wartet auf die Anfrage : Nachdem die Fastcgi-Anfrage eintrifft, beginnt der Worker, die Anforderungsdaten zu empfangen und zu analysieren, bis die Anforderungsdaten vollständig eintreffen.
3. Führen Sie php_request_startup() aus. In dieser Phase wird jede Erweiterung aufgerufen: PHP_RINIT_FUNCTION ();
4. Die Kompilierung und Ausführung des PHP-Skripts wird durch php_execute_script(); abgeschlossen. Nachdem die Anfrage abgeschlossen ist, wird diese Phase ausgeführt Rufen Sie jede Erweiterung auf: PHP_RSHUTDOWN_FUNCTION() und geben Sie dann Schritt (1) ein, um auf die nächste Anfrage zu warten.
1.static: Diese Methode ist relativ einfach. Beim Start gibt der Master die entsprechende Anzahl von Worker-Prozessen entsprechend den pm.max_children aus Konfiguration, dh Worker Die Anzahl der Prozesse ist festgelegt
2.dynamisch: Dynamische Prozessverwaltung, initialisieren Sie beim Start von fpm zunächst eine bestimmte Anzahl von Workern, wenn der Master dies feststellt Die Anzahl der inaktiven Worker ist niedriger als die Konfigurationsnummer von pm.min_spare_servers (was darauf hinweist, dass zu viele Anforderungen vorliegen und der Worker diese nicht verarbeiten kann). Der Worker-Prozess wird gegabelt, aber die Gesamtzahl der Worker darf pm.max_children nicht überschreiten Der Master stellt fest, dass die Anzahl der inaktiven Arbeiter pm.max_spare_servers überschreitet (was darauf hinweist, dass zu viele inaktive Arbeiter vorhanden sind). Der Master steuert die Anzahl der Arbeiter durch diese 4 Werte
3.ondemand: Diese Methode wird im Allgemeinen selten verwendet und weist beim Start keine Worker-Prozesse zu. Warten Sie, bis eine Anforderung vorliegt, und benachrichtigen Sie dann den Master-Prozess, um den Worker-Prozess nicht zu überschreiten pm.max_children. Der Arbeitsprozess wird nicht sofort nach Abschluss der Verarbeitung beendet. Er wird beendet, wenn die Leerlaufzeit pm.process_idle_timeout
PHP-FPM Event Manager1.sp[1] Pipeline-lesbares Ereignis: Dieses Ereignis wird vom Master zum Verarbeiten von Signalen verwendet
2.fpm_pctl_perform_idle_server_maintenance_heartbeat(): Dies ist das Hauptereignis bei der Implementierung des Prozessmanagements. Der Master startet einen Timer , das alle 1 Sekunde ausgelöst wird. Es wird hauptsächlich für die Worker-Verwaltung im dynamischen und On-Demand-Modus verwendet. Der Master überprüft regelmäßig die Anzahl der Worker-Prozesse in jedem Worker-Pool und implementiert sie über diesen Timer3.fpm_pctl_heartbeat(): Dieses Ereignis wird verwendet, um die maximale Zeit zu begrenzen, die ein Worker benötigt, um eine einzelne Anfrage zu verarbeiten. Es gibt ein request_terminate_timeout-Konfigurationselement in php-fpm.conf Wenn der Worker eine Anforderung verarbeitet, sendet er das Signal kill -TERM, um den Worker-Prozess zu beenden. Der Standardwert ist 0, was bedeutet, dass dieser Mechanismus deaktiviert ist >
4.fpm_pctl_on_socket_accept(): Neue Überwachungsfunktion des Masters im On-Demand-Modus Das Ereignis des Anforderungseintreffens, da fpm im On-Demand-Modus beim Start keine Worker vorab erstellt und nur dann ein untergeordneter Prozess generiert wird Es liegt eine Anfrage vor, daher muss der Masterprozess benachrichtigt werden, wenn die Anfrage eintrifftDas obige ist der detaillierte Inhalt von(PHP7-Kernel-Analyse-1) CGI und FastCGI. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!