Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der vier PHP-Laufmodi

Detaillierte Erläuterung der vier PHP-Laufmodi

小云云
小云云Original
2018-05-12 11:26:415184Durchsuche

Es gibt 4 Betriebsmodi für PHP:

1) cgi Common Gateway Interface)

2) fast-cgi resident (long-live) Typ CGI php-fpm

3) CLI-Befehlszeilenbetrieb (Befehlszeilenschnittstelle)

4) Webmodulmodus (Modulmodus, der von Webservern wie Apache ausgeführt wird)

1. CGI (Common Gateway Interface)

CGI ist das Common Gateway Interface (Common Gateway Interface). Eine Brücke, die die Webseite und das Ausführungsprogramm im WEB-Server verbindet. Sie leitet die von HTML empfangenen Anweisungen an das Ausführungsprogramm des Servers weiter und gibt dann die Ergebnisse des Ausführungsprogramms des Servers an die HTML-Seite zurück. CGI ist äußerst plattformübergreifend und kann auf fast jedem Betriebssystem implementiert werden. CGI ist bereits ein älteres Modell und wurde in den letzten Jahren nur noch selten eingesetzt.

Bei jeder Benutzeranfrage wird zuerst ein CGI-Unterprozess erstellt, dann wird die Anfrage verarbeitet und der Unterprozess wird nach der Verarbeitung beendet. Dies ist das Fork-and-Execute Modus. Wenn die Anzahl der Benutzeranforderungen sehr groß ist, werden große Mengen an Systemressourcen wie Speicher, CPU-Zeit usw. belegt, was zu einer geringen Leistung führt. Daher verfügt ein Server, der CGI verwendet, über so viele CGI-Unterprozesse wie Verbindungsanforderungen. Das wiederholte Laden von Unterprozessen ist der Hauptgrund für die geringe CGI-Leistung.

Wenn Sie PHP nicht in serverseitige Software (wie Apache) einbetten und als Modul installieren möchten, können Sie es im CGI-Modus installieren. Oder verwenden Sie PHP mit verschiedenen CGI-Wrappern, um sichere Chroot- und Setuid-Umgebungen für Ihren Code zu erstellen. Auf diese Weise fordert jeder Client eine PHP-Datei an, und der Webserver ruft php.exe (php.exe unter Win, PHP unter Linux) auf, um die Datei zu interpretieren, und gibt dann das Ergebnis der Interpretation in Form von an den Client zurück eine Webseite. Diese Installationsmethode installiert normalerweise die ausführbare PHP-Datei im cgi-bin-Verzeichnis des Webservers. Die CERT-Empfehlung CA-96.11 empfiehlt, keine Interpreter im cgi-bin-Verzeichnis abzulegen.

Der Vorteil dieser Methode besteht darin, dass sie den Webserver von der spezifischen Programmverarbeitung trennt, eine klare Struktur und eine starke Kontrollierbarkeit aufweist. Gleichzeitig besteht der Nachteil darin, dass bei hoher Zugriffsnachfrage die CGI Der Prozess wird gegabelt. Dies stellt eine enorme Belastung für den Server dar. Stellen Sie sich vor, dass Hunderte gleichzeitiger Anforderungen dazu führen, dass der Server Hunderte von Prozessen aufspaltet. Aus diesem Grund war CGI schon immer für seine geringe Leistung und seinen hohen Ressourcenverbrauch bekannt.

Installation des CGI-Modus:

CGI ist bereits ein älterer Modus und wurde in den letzten Jahren selten verwendet, wir dienen also nur zum Testen.

Um den CGI-Modus zu installieren, müssen Sie die Zeile

LoadModule php5_module module/libphp5.so auskommentieren. Wenn Sie diese Zeile nicht kommentieren, gelangt sie direkt in den Handler-Modus. Das ist der Modulmodus.

Fügen Sie dann die Aktion in httpd.conf hinzu:

Aktion application/x-httpd-php /cgi-bin/

Falls nicht im Verzeichnis /cgi-bin/ gefunden php-cgi. Sie können eins aus dem PHP-Bin kopieren.

Starten Sie dann Apache neu, öffnen Sie dann die Testseite und stellen Sie fest, dass sich die Server-API in CGI/FastCGI ändert. Beschreibung: Erfolgreich in den CGI-Modus gewechselt.

Frage:

1) Wenn das CGI-Programm in /usr/local/httpd/cgi-bin/ nicht ausgeführt werden kann und ein 403- oder 500-Fehler auftritt

Öffnen Sie das Apache-Fehlerprotokoll und die folgende Eingabeaufforderung wird angezeigt: Erlaubnis verweigert: exec von

kann die Attribute des CGI-Programms überprüfen. Wie in der Linux-Kontextdatei definiert, muss /usr/local/httpd/cgi-bin/ das Attribut httpd_sys_script_exec_t sein. Überprüfen Sie es mit ls -Z. Wenn nicht, ändern Sie es mit dem folgenden Befehl: chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/*.cgi Wenn es sich im virtuellen Host um CGI handelt, lesen Sie Frage 2, um es zu verwenden Normale Funktionen. Stellen Sie anschließend den Kontext der CGI-Datei über chcon auf

httpd_sys_script_exec_t ein. chcon -R -t httpd_sys_script_exec_t cgi-bin/

2) Apache-Fehlermeldung: .... fehlerhafter Header vom Skript=

Laut Eingabeaufforderung liegt ein Problem mit vor Überprüfen Sie den Header. Wie lautet der erste Satz der Ausgabe? Nach der Deklaration des Inhaltstyps sollten zwei Leerzeilen ausgegeben werden.

3) Apache-Fehlermeldung: Exec-Formatfehler

Fehler bei der Einstellung des Skriptinterpreters. Die erste Zeile des Skripts sollte die Form „#!Interpreter Path“ haben und den Pfad des Skriptinterpreters angeben. Wenn es sich um ein PERL-Programm handelt, lautet der allgemeine Pfad: #!/usr/bin/perl oder #. !/usr/local/bin /perl Wenn es sich um ein PHP-Programm handelt, müssen Sie den Interpreterpfad nicht eingeben, das System findet PHP automatisch.

2. Fastcgi-Modus

Fast-CGI ist eine aktualisierte Version von CGI. FastCGI kann wie ein langlebiges CGI ausgeführt werden Solange es aktiviert ist, dauert es nicht jedes Mal, sich zu forken (dies ist der am meisten kritisierte Fork-and-Execute-Modus von CGI). Das Funktionsprinzip von FastCGI ist: (1) Der FastCGI-Prozessmanager wird geladen, wenn der Webserver startet [PHPs FastCGI-Prozessmanager ist PHP-FPM (php-FastCGI Process Manager)]. 】(IIS ISAPI oder Apache-Modul);

(2), der FastCGI-Prozessmanager initialisiert sich selbst, startet mehrere CGI-Interpreterprozesse (mehrere php-cgi.exe im Task-Manager sichtbar) und wartet auf die Verbindung vom Webserver.

(3) Wenn die Client-Anfrage den Webserver erreicht, wählt der FastCGI-Prozessmanager einen CGI-Interpreter aus und stellt eine Verbindung her. Der Webserver sendet CGI-Umgebungsvariablen und Standardeingaben an den FastCGI-Unterprozess php-cgi.

(4) Nachdem der FastCGI-Unterprozess die Verarbeitung abgeschlossen hat, gibt er Standardausgabe- und Fehlerinformationen über dieselbe Verbindung an den Webserver zurück. Wenn der untergeordnete FastCGI-Prozess die Verbindung schließt, wird die Anfrage verarbeitet. Der untergeordnete FastCGI-Prozess wartet dann auf die nächste Verbindung vom FastCGI-Prozessmanager (der in WebServer ausgeführt wird) und verarbeitet diese. Im normalen CGI-Modus wird php-cgi oder .exe hier beendet.

Im CGI-Modus können Sie sich vorstellen, wie langsam CGI normalerweise ist. Jede Webanfrage an PHP muss php.ini neu analysieren, alle DLL-Erweiterungen neu laden und alle Datenstrukturen neu initialisieren. Bei FastCGI geschieht dies alles nur einmal, nämlich beim Start des Prozesses. Ein zusätzlicher Bonus besteht darin, dass dauerhafte Datenbankverbindungen funktionieren.

Vorteile von Fastcgi:

1) Aus Stabilitätsgründen führt fastcgi CGI in einem unabhängigen Prozesspool aus. Wenn ein einzelner Prozess ausfällt, kann das System ihn problemlos verwerfen und dann einen neuen Prozess neu zuweisen, um die Logik auszuführen.

2 ) Aus Sicherheitsgründen unterstützt Fastcgi das verteilte Rechnen. Egal wie schnell Fastcgi ausfällt, es führt nicht zu einem Ausfall des Servers Ansicht: Fastcgi kann die dynamische logische Verarbeitung vom Server trennen und die E/A-Verarbeitung mit hoher Last weiterhin dem Host-Server überlassen, sodass sich der Host-Server auf die logische Verarbeitung einer normalen dynamischen Webseite konzentrieren kann Möglicherweise handelt es sich nur um einen kleinen Teil und eine große Anzahl statischer Bilder usw.

FastCGI-Nachteile: Nachdem wir über die Vorteile gesprochen haben, sprechen wir über die Nachteile. Aus meiner tatsächlichen Verwendung heraus eignet sich der FastCGI-Modus besser für Server in Produktionsumgebungen. Für Entwicklungsmaschinen ist es jedoch nicht geeignet. Denn wenn man Zend Studio zum Debuggen des Programms verwendet, geht FastCGI davon aus, dass der PHP-Prozess abgelaufen ist und gibt einen 500-Fehler auf der Seite zurück. Das war so ärgerlich, dass ich auf meinem Entwicklungscomputer wieder in den ISAPI-Modus wechselte.

Fastcgi-Modus installieren:

Der Installationspfad von Apache ist /usr/local/httpd/

Der Installationspfad von PHP ist /usr/local/php/

1) Installieren Sie mod_fastcgi

wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz

tar zxvf mod_fastcgi-2.4.6. tar.gz

cd mod_fastcgi-2.4.6

cp Makefile.AP2 Makefile

vi Makefile, bearbeiten Sie top_dir = /usr/local/httpd

make

make install

Nach der Installation gibt es eine weitere Datei in

/usr/local/httpd/modules/: mod_fcgid.so

2) PHP neu kompilieren

./configure --prefix=/usr/local/php --enable-fastcgi --enable-force-cgi-redirect --disable-cli

make

make install

Nach dem Kompilieren auf diese Weise ist php-cgi im PHP-bin-Verzeichnis der Fastcgi-Modus-PHP-Interpreter

Nach erfolgreicher Installation führen Sie

aus php -v Ausgabe

PHP 5.3.2 (cgi-fcgi).

Die Ausgabe hier enthält cgi-fcgi

Hinweis:

1 Parameter können nicht hinzugefügt werden –with-apxs=/usr/local/httpd/bin/apxs Andernfalls befindet sich die installierte ausführbare PHP-Datei im CLI-Modus

2 Wenn Sie beim Kompilieren nicht --disable-cli hinzufügen, PHP 5.3.2 wird ausgegeben ( cli)

3) Apache konfigurieren

Apache muss konfiguriert werden, um das PHP-Programm im FastCGI-Modus auszuführen

vi httpd.conf

Die Art und Weise, wie wir die Implementierung der virtuellen Maschine verwenden:

#Fastcgi-Modul laden

LoadModule fastcgi_module module/mod_fastcgi.so

#//以静态方式执行fastcgi 启动了10进程
FastCgiServer /usr/local/php/bin/php-cgi  -processes 10 -idle-timeout 150 -pass-header HTTP_AUTHORIZATION
<VirtualHost *:80>
     #
     DocumentRoot   /usr/local/httpd/fcgi-bin   
     ServerName www.fastcgitest.com
     
     ScriptAlias /fcgi-bin/   /usr/local/php/bin/   #定义目录映射 /fcgi-bin/ 代替 /usr/local/php/bin/
     Options +ExecCGI
     AddHandler fastcgi-script .php .fcgi         #.php结尾的请求都要用php-fastcgi来处理  
     AddType application/x-httpd-php .php     #增加MIME类型
     Action application/x-httpd-php /fcgi-bin/php-cgi  #设置php-fastcgi的处理器: /usr/local/php/bin/php-cgi
 
 <Directory /usr/local/httpd/fcgi-bin/>
      Options Indexes ExecCGI
      Order allow,deny
      allow from all
 </Directory>
</VirtualHost>
 
或者
<IfModule mod_fastcgi>ScriptAlias /fcgi-bin/ "/usr/local/php/bin"
 #定义目录映射FastCgiServer /usr/local/php/bin/php-cgi   -processes 10 
 #配置fastcgi server,<Directory "/usr/local/httpd/fcgi-bin/">
 SetHandler fastcgi-scriptOptions FollowSymLinksOrder allow,denyAllow from all
 </Directory>AddType application/x-httpd-php .php  
 #增加MIME类型AddHandler php-fastcgi .php   
 #.php结尾的请求都要用php-fastcgi来处理Action php-fastcgi /fcgi-bin/php-cgi 
 #设置php-fastcgi的处理器
</IfModule>

4). Starten Sie Apache neu, prüfen Sie phpinfo, ob die Serverinformationen lauten:

Apache/2.2.11 (Unix) mod_fastcgi/ 2.4.6 oder so ähnlich bedeutet, dass die Installation erfolgreich war.

Wenn ein 403-Fehler auftritt, prüfen Sie, ob /usr/local/httpd/fcgi-bin/ über ausreichende Berechtigungen verfügt.

oder

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>
改为:
<Directory />
    Options FollowSymLinks
    AllowOverride None
Order allow,deny
Allow from all
</Directory>

reichen aus.

ps -ef|grep php-cgi kann 10 ausgeführte Fastcgi-Prozesse sehen.

3. CLI-Modus

CLI ist der Befehlszeilen-Ausführungsmodus von PHP, aber Sie haben ihn möglicherweise nicht bemerkt (Zum Beispiel: Unter Linux verwenden wir häufig „php -m“, um herauszufinden, welche Erweiterungen PHP installiert hat. Dies ist der PHP-Befehlszeilen-Ausführungsmodus. Interessierte Schüler können php -h eingeben, um den Ausführungsmodus eingehend zu studieren.)

1. Lassen Sie PHP die angegebene Datei ausführen.

php script.php

php -f script.php

Beide der oben genannten Methoden (mit oder ohne den Parameter -f) können die script.php des Skripts ausführen. Sie können eine beliebige Datei zum Ausführen auswählen. Die von Ihnen angegebenen PHP-Skripte müssen keine .php-Erweiterung haben;

2. Führen Sie PHP-Code direkt in der Befehlszeile aus.

php -r "print_r(get_defined_constants());"

Bitte achten Sie bei der Verwendung dieser Methode auf die Ersetzung von Shell-Variablen und die Verwendung von Anführungszeichen.

Hinweis: Bitte lesen Sie das obige Beispiel sorgfältig durch. Beim Ausführen des Codes gibt es keine Start- und Endmarkierungen! Mit dem Parameter -r sind diese Markierungen unnötig und führen zu einem Syntaxfehler.

3. Geben Sie den PHP-Code an, der über die Standardeingabe (stdin) ausgeführt werden muss.

Die obige Verwendung bietet uns sehr leistungsstarke Funktionen, die es uns ermöglichen, PHP-Code dynamisch zu generieren und diese Codes über die Befehlszeile auszuführen, wie im folgenden Beispiel gezeigt:

$ some_application | |. sort -u >final_output.txt

4. Modulmodus

Modulmodus ist hier in Form von mod_php5 integriert time mod_php5 Die Funktion des Moduls besteht darin, von Apache übergebene PHP-Dateianforderungen zu empfangen, diese Anforderungen zu verarbeiten und die verarbeiteten Ergebnisse dann an Apache zurückzugeben. Wenn wir das PHP-Modul (mod_php5) in seiner Konfigurationsdatei konfigurieren, bevor Apache startet, registriert das PHP-Modul den ap_hook_post_config-Hook von Apache2 und startet dieses Modul, wenn Apache beginnt, Anfragen für PHP-Dateien anzunehmen.

Zusätzlich zu dieser Lademethode beim Start können die Module von Apache zur Laufzeit dynamisch geladen werden, was bedeutet, dass der Server erweitert werden kann, ohne dass der Quellcode neu kompiliert oder der Server überhaupt gestoppt werden muss. Wir müssen lediglich das Signal HUP oder AP_SIG_GRACEFUL an den Server senden, um den Server zu benachrichtigen, das Modul neu zu laden. Vor dem dynamischen Laden müssen wir das Modul jedoch in eine dynamische Linkbibliothek kompilieren. Beim dynamischen Laden wird zu diesem Zeitpunkt die dynamische Linkbibliothek geladen. Die Verarbeitung dynamischer Linkbibliotheken in Apache wird über das Modul mod_so abgeschlossen, sodass das Modul mod_so nicht dynamisch geladen, sondern nur statisch in den Kern von Apache kompiliert werden kann. Dies bedeutet, dass es zusammen mit Apache gestartet wird.

Wie lädt Apache Module? Nehmen wir als Beispiel das zuvor erwähnte Modul mod_php5. Zuerst müssen wir der Apache-Konfigurationsdatei httpd.conf eine Zeile hinzufügen:

Diese Betriebsart wird häufig verwendet, wenn der Apache-Server in der Windows-Umgebung verwendet wird. Bei der Modularisierung (DLL) ist PHP der Webserver läuft gemeinsam. (Es ist eine auf CGI basierende Erweiterung von Apache, um die Betriebseffizienz von PHP zu beschleunigen)

[plain]view plaincopyprint?

1 LoadModule php5_module module/mod_php5.so

Hier verwenden wir den LoadModule-Befehl. Der erste Parameter des Befehls ist der Name des Moduls. Der Name ist im Quellcode der Modulimplementierung zu finden. Die zweite Option ist der Pfad, in dem sich das Modul befindet. Wenn Sie ein Modul laden müssen, während der Server läuft, können Sie das Signal HUP oder AP_SIG_GRACEFUL an den Server senden. Sobald das Signal empfangen wird, lädt Apache das Modul neu, ohne den Server neu zu starten.

Verwandte Empfehlungen:

Zusammenfassung der PHP-Betriebsmodi

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der vier PHP-Laufmodi. 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