Der Hauptinhalt dieses Artikels ist das Diagramm der Beziehung zwischen CGI, FastCGI und PHP-FPM. Jetzt kann ich es mit Ihnen teilen.
Verzeichnis
Basic
Modulmethode
CGI
Einführung in FastCGI
Eine kurze Einführung in FastCGI
Wie FastCGI funktioniert
Einführung in PHP-FPM
Zusammenfassung
Referenzen
Beim Aufbau eines LAMP/LNMP-Servers stößt man häufig auf die Konzepte PHP-FPM, FastCGI und CGI. Wenn Sie nur wenig darüber wissen, wird es schwierig, einen leistungsstarken Server zu bauen. Als nächstes werden wir die Beziehung zwischen diesen Konzepten grafisch erklären.
In der gesamten Website-Architektur ist der Webserver (wie Apache) lediglich der Verteiler von Inhalten. Wenn der Client beispielsweise index.html anfordert, findet der Webserver diese Datei im Dateisystem und sendet sie an den Browser. Dabei handelt es sich um statische Daten.
Wenn die Anfrage index.php ist, weiß der Webserver laut Konfigurationsdatei, dass es sich nicht um eine statische Datei handelt und muss einen PHP-Parser finden, um sie zu verarbeiten , dann wird die Anfrage verarbeitet. Verarbeiten Sie sie einfach und übergeben Sie sie dann an den PHP-Parser.
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. Dies ist ein vollständiger dynamischer PHP-Webzugriffsprozess. Wenn wir als nächstes diese Konzepte vorstellen, wird es einfacher:
CGI: Es ist ein Protokoll für den Datenaustausch zwischen Webserver und Webanwendung.
FastCGI: Wie CGI ist es ein Kommunikationsprotokoll, weist jedoch gegenüber CGI einige Effizienzoptimierungen auf. Ebenso ähnelt das SCGI-Protokoll FastCGI.
PHP-CGI: ist das Schnittstellenprogramm von PHP (Webanwendung) zum vom Webserver bereitgestellten CGI-Protokoll.
PHP-FPM: ist ein Schnittstellenprogramm für das FastCGI-Protokoll, das von PHP (Webanwendung) zusätzlich zum Webserver bereitgestellt wird Darüber hinaus bietet es eine relativ intelligente Aufgabenverwaltung.
Im WEB
Webserver bezieht sich im Allgemeinen auf Server wie Apache, Nginx, IIS, Lighttpd, Tomcat usw.,
Webanwendung bezieht sich im Allgemeinen auf Anwendungen wie PHP, Java und Asp.net.
Bevor wir CGI verstehen, wollen wir zunächst eine andere Methode für den Webserver zum Übertragen von Daten verstehen: PHP-Modullademethode. Nehmen Sie als Beispiel Apache. Sollten Sie im PHP-Modulmodus die folgenden Sätze zur Apache-Konfigurationsdatei httpd.conf hinzufügen:
# 加入以下2句LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下内容<IfModule dir_module> DirectoryIndex index.php index.html</IfModule>
Das Obige ist die manuelle Konfiguration nach der Installation der PHP- und Apache-Umgebung Die Installation des Quellcodes unter Linux ist grob wie folgt konfiguriert:
# ./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars
Auf diese Weise besteht ihr gemeinsames Wesen darin, LoadModule zum Laden von php5_module zu verwenden, d. h. PHP als Apache zu verwenden Ein Submodul zum Ausführen von . Beim Zugriff auf PHP-Dateien über das Web ruft Apache php5_module auf, um den PHP-Code zu analysieren.
Wie übergibt php5_module Daten an den PHP-Parser, um den PHP-Code zu analysieren? Die Antwort ist durch Sapi.
Sehen wir uns ein weiteres Bild an, um ausführlich über die Beziehung zwischen Apache, PHP und Sapi zu sprechen:
Auf dem obigen Bild können wir Sapi sehen ist ein solcher Zwischenprozess. SAPI stellt eine Schnittstelle für die externe Kommunikation bereit, die einem Socket ähnelt und es PHP ermöglicht, mit anderen Anwendungen (Apache, Nginx usw.) zu interagieren. PHP stellt standardmäßig viele Arten von SAPI bereit. Die häufigsten sind php5_module, CGI, FastCGI für Apache und Nginx, ISAPI für IIS und Shell CLI.
Der obige Apache-Aufruf-PHP-Ausführungsprozess ist also wie folgt:
apache -> httpd -> php5_module -> sapi -> php
Okay. Lassen Sie uns Apache und PHP über php5_module herausfinden!
In diesem Modus wird das PHP-Modul in Apache installiert. Jedes Mal, wenn Apache eine Anfrage beendet, wird ein Prozess generiert, der verschiedene Berechnungen und andere Vorgänge von PHP vollständig umfasst.
Im Bild oben können wir deutlich sehen, dass jedes Mal, wenn Apache eine Anfrage erhält, ein Prozess generiert wird, um eine Verbindung zu PHP herzustellen und die Anfrage über Sapi abzuschließen. Es ist denkbar, dass, wenn es zu viele Benutzer gibt, concurrent Wenn die Anzahl zu hoch ist, kann der Server sie nicht ertragen.
Außerdem ist es beim Kompilieren von mod_php in Apache schwierig festzustellen, ob es sich um ein Problem mit PHP oder Apache handelt, wenn ein Problem auftritt.
CGI (Common Gateway Interface) vollständiger Name ist „Common Gateway Interface“, WEB-Server und PHP Anwendung Ein Werkzeug zum „Sprechen“, dessen Programm auf einem Netzwerkserver laufen muss. CGI kann in jeder Sprache geschrieben werden, solange die Sprache über Standard-Eingabe-, Ausgabe- und Umgebungsvariablen verfügt. Wie PHP, Perl, TCL usw.
Welche Daten übergibt der WEB-Server an den PHP-Parser? URL, Abfragezeichenfolge, POST-Daten, HTTP-Header werden alle vorhanden sein. Daher handelt es sich bei CGI um ein Protokoll, das festlegt, welche Daten übertragen werden sollen und in welchem Format sie zur Bearbeitung der Anfrage an das Backend übergeben werden. Überlegen Sie genau, woher die Benutzer kommen, die Sie in Ihrem PHP-Code verwenden.
Mit anderen Worten, CGI wird speziell für den Umgang mit Webservern verwendet. Wenn der Webserver eine Benutzeranfrage empfängt, sendet er die Anfrage an das CGI-Programm (z. B. php-cgi). Das CGI-Programm verarbeitet (parst PHP) gemäß den in der Anfrage übermittelten Parametern und gibt dann ein Standard-HTML aus Anweisung und geben Sie sie an den Webserver zurück. So funktioniert normales CGI.
Der Vorteil von CGI besteht darin, dass es völlig unabhängig von jedem Server ist und nur als Vermittler fungiert. Bietet Schnittstellen zu Apache und PHP. Sie vervollständigen die Datenübertragung über die CGI-Verkabelung. Dies hat den Vorteil, dass die Assoziation zwischen den beiden minimiert und sie unabhängiger werden.
Aber es gibt eine problematische Sache bei CGI, nämlich, dass jede Webanfrage einen Start- und Beendigungsprozess hat, was der am meisten kritisierte Fork-and-Execute-Modus ist Wenn die Parallelität hoch ist, wird es eine Sackgasse sein.
Grundsätzlich wird FastCGI verwendet, um die Leistung von CGI-Programmen zu verbessern. Ähnlich wie CGI kann FastCGI auch als Protokoll bezeichnet werden.
FastCGI ist wie ein residentes (langlebiges) CGI Es kann jederzeit ausgeführt werden Zeit. Es ist Zeit, einmal zu forken. Es unterstützt auch verteiltes Rechnen, das heißt, FastCGI-Programme können auf anderen Hosts als dem Website-Server ausgeführt werden und Anfragen von anderen Website-Servern akzeptieren.
FastCGI ist eine sprachunabhängige, offene CGI-Erweiterung mit skalierbarer Architektur. Ihr Hauptverhalten besteht darin, den CGI-Interpreterprozess im Speicher zu halten und so eine höhere Leistung zu erzielen. Wie wir alle wissen, ist das wiederholte Laden des CGI-Interpreters der Hauptgrund für eine geringe CGI-Leistung. Wenn der CGI-Interpreter im Speicher bleibt und die Planung des FastCGI-Prozessmanagers akzeptiert, kann er gute Leistung, Skalierbarkeit, Failover-Funktionen usw. bieten.
Der FastCGI-Schnittstellenmodus verwendet eine C/S-Struktur, die den HTTP-Server und den Skript-Parsing-Server trennen und einen oder mehrere Skript-Parsing-Daemons auf dem Skript-Parsing-Server starten kann. Jedes Mal, wenn der HTTP-Server auf ein dynamisches Programm trifft, kann es zur Ausführung direkt an den FastCGI-Prozess übermittelt und das Ergebnis dann an den Browser zurückgegeben werden. Mit dieser Methode kann der HTTP-Server ausschließlich statische Anforderungen verarbeiten oder die Ergebnisse des dynamischen Skriptservers an den Client zurückgeben, was die Leistung des gesamten Anwendungssystems erheblich verbessert.
Laden Sie den FastCGI-Prozessmanager (Apache-Modul oder IIS ISAPI usw.), wenn der Webserver startet
Der FastCGI-Prozessmanager initialisiert sich selbst, startet mehrere CGI-Interpreterprozesse (es können mehrere PHP-CGI erstellt werden) und wartet auf Verbindungen vom Webserver.
Wenn eine Client-Anfrage den Webserver erreicht, wählt der FastCGI-Prozessmanager einen CGI-Interpreter aus und stellt eine Verbindung zu ihm her. Der Webserver sendet CGI-Umgebungsvariablen und Standardeingaben an den FastCGI-Unterprozess php-cgi.
Nachdem der FastCGI-Unterprozess die Verarbeitung abgeschlossen hat, gibt er über dieselbe Verbindung Standardausgabe- und Fehlerinformationen an den Webserver zurück. Wenn der untergeordnete FastCGI-Prozess die Verbindung schließt, wird die Anfrage verarbeitet. Der untergeordnete FastCGI-Prozess wartet dann und verarbeitet die nächste Verbindung vom FastCGI-Prozessmanager (der auf dem Webserver ausgeführt wird). Im CGI-Modus wird php-cgi an dieser Stelle beendet.
Funktionen von FastCGI und CGI:
Für CGI muss PHP php.ini für jede Webanfrage neu analysieren und laden. Alle werden erweitert und alle Datenstrukturen werden neu initialisiert. Bei FastCGI geschieht dies alles nur einmal, nämlich beim Start des Prozesses. Ein zusätzlicher Bonus besteht darin, dass dauerhafte Datenbankverbindungen funktionieren.
Da es sich bei FastCGI um einen Multiprozess handelt, verbraucht es mehr Serverspeicher als CGI-Multithreading. Der PHP-CGI-Interpreter verbraucht 7 bis 25 Megabyte Speicher pro Prozess Oder 100 ist eine sehr große Speicherzahl.
Um PHP-FPM zu verstehen, müssen Sie zunächst über PHP-CGI sprechen.
PHP-CGI ist der integrierte FastCGI-Manager , der von PHP implementiert wird. Obwohl es sich um ein offizielles PHP-Produkt handelt, ist es überhaupt nicht leistungsstark, die Leistung ist zu schlecht und es ist auch sehr problematisch und unpersönlich, was sich hauptsächlich in:
php-cgi widerspiegelt Ändert PHP. Nach der INI-Konfiguration müssen Sie PHP-CGI neu starten, damit die neue PHP-INI wirksam wird. Ein reibungsloser Neustart ist nicht möglich.
Beenden Sie den PHP-CGI-Prozess direkt und PHP kann nicht ausgeführt werden.
Die beiden oben genannten Probleme beschäftigen viele Menschen schon seit langem, daher verwenden viele Menschen immer noch die Modulmethode. Erst 2004 erfand ein Verlierer namens Andrei Nigmatulin diese Situation vollständig. Es handelt sich um einen PHP-spezifischen FastCGI-Manager, der die beiden oben genannten Probleme problemlos überwindet Leistung in anderen Aspekten.
Mit anderen Worten, PHP-FPM ist eine spezifische Implementierung des FastCGI-Protokolls. Es ist für die Verwaltung eines Prozesspools zur Bearbeitung von Anfragen vom Webserver verantwortlich. Derzeit ist PHP-FPM nach der PHP5.3-Version in PHP integriert .
Da PHP-CGI nur ein CGI-Programm ist, kann es nur Anfragen analysieren und Ergebnisse zurückgeben, weiß aber nicht, wie es Prozesse verwalten soll. Daher gibt es einige Programme, die den PHP-CGI-Prozess planen können, z. B. spawn-fcgi getrennt von lighthttpd. Ebenso ist PHP-FPM auch ein Verwaltungsprogramm, das zur Planung und Verwaltung des PHP-Parsers php-cgi verwendet wird.
PHP-FPM kann einen reibungslosen Neustart nach der Änderung von php.ini erreichen, indem es einen neuen Unterprozess generiert.
Lassen Sie uns abschließend zusammenfassen, welche Probleme diese Technologien nach kontinuierlichen Upgrades lösen können (sonst würden sie nicht aktualisiert).
Wenn Sie also einen leistungsstarken PHP-WEB-Server erstellen möchten, ist Apache/Nginx derzeit der beste Weg + FastCGI + PHP-FPM(+PHP-CGI) Methode, Modulladen oder CGI-Methode nicht mehr verwenden :)
Die Bilder in diesem Artikel wurden mit Visio erstellt, Quelldatei: php-fpm
Originaladresse: https://www.awaimai.com/371.html
Verwandte Empfehlungen:
PHP7 Kernel Analysis 1 CGI und FastCGI
Welche Beziehung besteht zwischen CGI, FastCGI und PHP_FPM?
Das obige ist der detaillierte Inhalt vonDiagramm der Beziehung zwischen CGI, FastCGI und PHP-FPM. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!