Heim > Backend-Entwicklung > PHP-Tutorial > Zusammenfassung der PHP-Ausführungsmodi

Zusammenfassung der PHP-Ausführungsmodi

高洛峰
Freigeben: 2023-03-04 10:02:01
Original
1713 Leute haben es durchsucht

Es gibt 4 Betriebsmodi für PHP:

1) cgi Common Gateway Interface)
2) fast-cgi long-live CGI
3) cli-Befehlszeilenbetrieb (Command Line Interface)
4) Webmodulmodus (Modulmodus für die Ausführung von Webservern wie Apache)
5) ISAPI (Internet Server Application Program Interface)

Hinweis: Nach PHP5.3, PHP verfügt nicht mehr über den ISAPI-Modus und die Datei php5isapi.dll ist nach der Installation nicht mehr vorhanden. Um eine höhere Version von PHP auf IIS6 zu verwenden, müssen Sie die FastCGI-Erweiterung installieren und dann IIS6 für die Unterstützung von FastCGI aktivieren.

1. CGI (Common Gateway Interface)

CGI ist das Common Gateway Interface (Common Gateway Interface). Für Laien ist CGI wie eine Brücke, die Webseiten verbindet und WEB Das Ausführungsprogramm im Server ist verbunden, es 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 die Abzweigung. Und-Ausführungsmodus. 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 und eine klare Struktur und starke Steuerbarkeit aufweist. Gleichzeitig besteht der Nachteil darin, dass der CGI-Prozess dies tut 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 durchführt. 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/
Wenn Sie php-cgi nicht im Verzeichnis /cgi-bin/ finden können, können Sie dies tun Laden Sie es von PHP herunter. Es befindet sich ein CP im Papierkorb.
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.
Problem:

1) Wenn das CGI-Programm nicht ausgeführt werden kann, wenn es in /usr/local/httpd/cgi-bin/ abgelegt ist und ein 403- oder 500-Fehler auftritt
Öffnen des Apache Im Fehlerprotokoll werden die folgenden Eingabeaufforderungen angezeigt: Berechtigung 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?
Content-type: text/plain; Am Ende sollten zwei Leerzeilen ausgegeben werden.

3) Apache-Fehlermeldung: Exec-Formatfehler
Fehler bei der Einstellung des Skriptinterpreters. Die erste Zeile des Skripts sollte den Pfad des Skriptinterpreters in der Form „#!Interpreter Path“ 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 wie ein langlebiges CGI wird nicht jedes Mal Zeit für den Fork benötigen (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). Prozessmanager)] (IIS ISAPI oder Apache-Modul);

(2), FastCGI-Prozessmanager initialisiert sich selbst und startet mehrere CGI-Interpreterprozesse (mehrere PHP-, die im Task-Manager angezeigt werden) cgi. exe) und warten Sie 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 ü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 auf die nächste Verbindung vom FastCGI-Prozessmanager (der in WebServer ausgeführt wird) und verarbeitet diese. Im normalen CGI-Modus wird php-cgi.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 stirbt, wird dies der Fall sein Sehr instabil. Verwerfen Sie es einfach und weisen Sie dann einen neuen Prozess zu, um die Logik auszuführen.
2) Aus Sicherheitsgründen unterstützt Fastcgi völlig unabhängig vom Host-Server. Der Server wird dadurch nicht heruntergefahren. Aus Leistungsgründen trennt fastcgi die Verarbeitung der dynamischen Logik vom Server. Die E/A-Verarbeitung mit hoher Auslastung bleibt dem Host-Server überlassen kann sich auf IO konzentrieren. Bei einer gewöhnlichen dynamischen Webseite gibt es möglicherweise nur einen kleinen Teil der logischen Verarbeitung, 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) Mod_fastcgi installieren

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,编辑top_dir = /usr/local/httpd
make
make insta
Nach dem Login kopieren

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 Login kopieren

Nach dem Kompilieren auf diese Weise , im bin-Verzeichnis von PHP php-cgi befindet sich der Fastcgi-Modus-PHP-Interpreter

Nach erfolgreicher Installation ausführen

php -v 输出
PHP 5.3.2 (cgi-fcgi).
Nach dem Login kopieren

Die Ausgabe hier enthält CGI -fcgi


Hinweis:


1. Die Kompilierungsparameter können nicht hinzugefügt werden –with-apxs=/usr/local/httpd/bin/apxs, sonst wird das installierte PHP Die ausführbare Datei befindet sich im CLI-Modus

2 Wenn Sie beim Kompilieren nicht –disable-cli hinzufügen, PHP 5.3.2(cli)
3) Apache konfigurieren

Sie müssen konfigurieren Apache, um das PHP-Programm im FastCGI-Modus auszuführen

vi httpd.conf

Wir verwenden eine virtuelle Maschine zur Implementierung:

#加载fastcgi模块
LoadModule fastcgi_module   modules/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>
Nach dem Login kopieren

4).Starten Sie Apache neu. Überprüfen Sie phpinfo. Wenn die Serverinformationen wie folgt lauten:

Apache/2.2.11 (Unix) mod_fastcgi/2.4.6 oder ähnliches, bedeutet dies, 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>
Nach dem Login kopieren

ist in Ordnung.

ps -ef|grep php-cgi kann 10 laufende Fastcgi-Prozesse sehen.

3. CLI-Modus

cli ist der Befehlszeilen-Ausführungsmodus von PHP. Sie verwenden ihn häufig, aber Sie bemerken ihn möglicherweise nicht (z. B. verwenden wir ihn häufig unter Linux). ) php -m „Finden Sie die von PHP installierten Erweiterungen, dem PHP-Befehlszeilen-Laufmodus; interessierte Schüler können php -h eingeben, um den Laufmodus eingehend zu studieren)


1. Lassen Sie PHP laufen die angegebene Datei.

php script.php
php -f script.php
Nach dem Login kopieren

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 stellt uns sehr leistungsstarke Funktionen zur Verfügung, 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 |. php |. sort -u >final_output.txt

Modulmodus ist in Form von mod_php5 integriert Rolle des mod_php5-Moduls: Es empfängt von Apache übergebene PHP-Dateianforderungen, verarbeitet diese Anforderungen und gibt die verarbeiteten Ergebnisse dann an Apache zurück. 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 Apache-Module dynamisch zur Laufzeit geladen werden, was bedeutet, dass der Server erweitert werden kann, ohne den Quellcode neu zu kompilieren, oder sogar überhaupt nicht anhalten zu müssen Der Server. 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:


Diesen Betriebsmodus verwenden wir häufig, wenn wir den Apache-Server in der Windows-Umgebung und bei der Modularisierung (DLL) PHP verwenden ist mit dem Webserver betriebsbereit. (Es ist eine auf CGI basierende Erweiterung von Apache, um die Betriebseffizienz von PHP zu beschleunigen)


LoadModule php5_module module/mod_php5.so


Hier verwenden wir den LoadModule-Befehl. Der erste Parameter dieses 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.


5 ISAPI-Modus

ISAPI (Internet Server Application Program Interface) ist eine Reihe von API-Schnittstellen für Internetdienste, die von Microsoft bereitgestellt werden. Eine ISAPI-DLL kann auf Anfrage des aktiviert werden Danach bleibt es im Speicher und wartet auf eine weitere Anfrage des Benutzers. Sie können auch mehrere Benutzeranforderungsverarbeitungsfunktionen in einer DLL einrichten. Darüber hinaus befinden sich die ISAPI-DLL-Anwendung und der WWW-Server im selben Prozess. und die Effizienz ist deutlich höher als die von CGI. (Aufgrund der Exklusivität von Microsoft kann es nur in der Windows-Umgebung ausgeführt werden)

PHP ist ein Apache-Modul. Nachdem der Apache-Server das System gestartet hat, werden mehrere Prozesskopien vorab generiert und im Speicher gespeichert Wenn eine Anfrage auftritt, wird sie sofort verarbeitet. Verwenden Sie diese Ersatz-Unterprozesse für die Verarbeitung, damit es nicht zu Verzögerungen durch das Laichen von Unterprozessen kommt. Diese Serverkopien werden nicht sofort nach der Verarbeitung einer HTTP-Anfrage beendet, sondern bleiben auf dem Computer und warten auf die nächste Anfrage. Die Reaktion auf Client-Browseranfragen ist schneller und die Leistung ist höher.

6. PHP-Laufmodus in Nginx (Nginx+ PHP-FPM)

Es gibt zwei gängige Stacks, die FastCGI verwenden: lighthttpd+spawn-fcgi; der andere ist nginx+PHP-FPM (spawn- fcgi kann ebenfalls verwendet werden).


A. Wie oben erwähnt, verwenden beide Strukturen FastCGI zur Unterstützung von PHP, sodass HTTPServer vollständig entlastet ist und besser reagieren und gleichzeitig verarbeiten kann. Daher haben sowohl lighttpd als auch nginx den Ruf, klein, aber leistungsstark und effizient zu sein.

B. Da spawn-fcgi Teil von lighttpd ist, wird spawn-fcgi im Allgemeinen zur Unterstützung von PHP verwendet. Wenn fcgi über einen hohen gleichzeitigen Zugriff verfügt, tritt der oben erwähnte Speicherverlust auf und sogar fastcgi wird automatisch neu gestartet. Das heißt: Der PHP-Skriptprozessor stürzt ab. Wenn der Benutzer zu diesem Zeitpunkt darauf zugreift, wird möglicherweise eine weiße Seite angezeigt (d. h. PHP kann nicht analysiert werden oder es tritt ein Fehler auf).
Noch etwas: Erstens enthält Nginx kein FastCGI (Spawn-Fcgi) wie Lighttpd selbst, daher muss es einen FastCGI-Prozessor eines Drittanbieters verwenden, um PHP zu analysieren, also sieht es tatsächlich so aus Dieses Nginx ist sehr flexibel und kann mit jedem Parsing-Prozessor eines Drittanbieters verbunden werden, um PHP-Parsing zu realisieren (es ist einfach in nginx.conf einzurichten). nginx kann spwan-fcgi verwenden (lighttpd muss zusammen installiert werden, aber der Port muss für nginx vermieden werden. Einige ältere Blogs haben diesbezügliche Installationsanleitungen, da spawn-fcgi jedoch die von Benutzern nach und nach entdeckten Mängel aufweist). oben, jetzt Reduzieren Sie langsam die Verwendung der Kombination aus Nginx + Spawn-Fcgi.

C. Aufgrund der Mängel von spawn-fcgi gibt es jetzt ein neues Drittanbieter-FastCGI (derzeit habe ich gehört, dass wir hart daran arbeiten, es in naher Zukunft zum PHP-Kern hinzuzufügen). Prozessor für PHP, genannt PHP -FPM (Sie können ihn für Details googeln). Im Vergleich zu spawn-fcgi bietet es die folgenden Vorteile:
Da es als PHP-Patch entwickelt wurde, muss es während der Installation zusammen mit dem PHP-Quellcode kompiliert werden, was bedeutet, dass es in den PHP-Kern kompiliert wird In Bezug auf die Leistung ist es besser;
Gleichzeitig ist es besser als spawn-fcgi im Umgang mit hoher Parallelität, zumindest wird der Fastcgi-Prozessor nicht automatisch neu gestartet. Die konkret verwendeten Algorithmen und Designs finden Sie bei Google.
Daher ist die aktuelle Leistung von Nginx, wie oben erwähnt, aufgrund der Leichtigkeit und Flexibilität überlegen, und immer mehr Menschen verwenden nach und nach diese Kombination: Nginx+PHP/PHP-FPM

7. Zusammenfassung

Derzeit gibt es drei beliebte Stacks im

HTTPServer-Bereich:

(1) Apache+mod_php5
( 2) lighttp+spawn-fcgi
(3) nginx+PHP-FPM

Die Leistung der letzten beiden der drei ist möglicherweise etwas besser, aber Apache verfügt über umfangreiche Module und Funktionen vorhanden, immer noch der Boss. Einige Leute haben getestet, dass nginx+PHP-FPM unter Bedingungen hoher Parallelität das Fünf- bis Zehnfache von Apache+mod_php5 erreichen kann. Jetzt verwenden immer mehr Leute nginx+PHP-FPM.

Weitere Artikel zur Zusammenfassung des PHP-Betriebsmodus finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage