SAPI
Der hier erwähnte PHP-Laufmodus bezieht sich tatsächlich auf SAPI (Server Application Programming Interface, Server Application Programming Port). SAPI bietet PHP eine Schnittstelle zur Kommunikation mit der Außenwelt. PHP nutzt diese Schnittstelle, um mit anderen Anwendungen zu interagieren. Für verschiedene Anwendungsszenarien bietet PHP auch eine Vielzahl unterschiedlicher SAPIs. Zu den gängigen gehören: Apache, Apache2filter, Apache2handler, CLI, CGI, Embed, Fast-CGI, Isapi usw.
php_sapi_name()
– Gibt den Schnittstellentyp zwischen dem Webserver und PHP zurück. Zu den möglichen zurückgegebenen Werten gehören aolserver, apache, apache2filter, apache2handler, caudium, cgi (bis PHP 5.3), cgi-fcgi, cli, cli-server, Continuity, embed, fpm-fcgi, isapi, litespeed, milter, nsapi, phttpd , pi3web, roxen, thttpd, tux und webjames.
php_sapi_name()
— 返回 web 服务器和 PHP 之间的接口类型。可能返回的值包括了 aolserver、apache、 apache2filter、apache2handler、 caudium、cgi (直到 PHP 5.3), cgi-fcgi、cli、 cli-server、 continuity、embed、fpm-fcgi、 isapi、litespeed、 milter、nsapi、 phttpd、pi3web、roxen、 thttpd、tux 和 webjames。目前 PHP 内置的很多 SAPI 实现都已不再维护或者变的有些非主流了,PHP 社区目前正在考虑将一些 SAPI 移出代码库。 社区对很多功能的考虑是除非真的非常必要,或者某些功能已近非常通用了,否则就在 PECL 库中。
接下来会对其中五个比较常见的运行模式进行说明。
CLI 模式
CLI( Command Line Interface ), 也就是命令行接口,PHP 默认会安装。通过这个接口,可以在 shell 环境下与 PHP 进行交互 。在终端里输入 php -v
,会得到类似下图的结果(安装了 PHP 前提下):
因为有 CLI 的存在,我们可以直接在终端命令行里运行 PHP 脚本,就像使用 shell、Python 那样,不用依赖于 WEB 服务器。比如 Laravel 框架中的 Artisan 命令行工具,它其实就是一个 PHP 脚本,用来帮助我们快速构建 Laravel 应用的。
CGI 模式
CGI(Common Gateway Interface,通用网关接口)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI 描述了服务器和请求处理程序之间传输数据的一种标准。
WEB 服务器只是内容的分发者。比如 Nginx,如果客户端请求了 /index.html
,那么 Nginx 会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据;如果客户端现在请求的是 /index.php
,根据配置文件,Nginx 知道这个不是静态文件,需要去找 PHP 解析器来处理,那么它会把这个请求经过简单处理后交给PHP 解析器。Nginx 会传哪些数据给 PHP 解析器呢?url 要有吧,查询字符串也得有吧,POST 数据也要有,HTTP 请求头 不能少吧,好的,CGI 就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。
CGI 模式运行原理:当 Nginx 收到浏览器 /index.php
这个请求后,首先会创建一个对应实现了 CGI 协议的进程,这里就是 php-cgi(PHP 解析器)。接下来 php-cgi 会解析 php.ini 文件,初始化执行环境,然后处理请求,再以 CGI 规定的格式返回处理后的结果,退出进程。最后,Nginx 再把结果返回给浏览器。整个流程就是一个 Fork-And-Execute
Viele der in PHP integrierten SAPI-Implementierungen werden nicht mehr gepflegt oder sind mittlerweile nicht mehr zum Mainstream geworden. Die PHP-Community erwägt derzeit, einige SAPIs aus der Codebasis zu entfernen. Die Community geht davon aus, dass viele Funktionen in der PECL-Bibliothek enthalten sind, es sei denn, sie sind wirklich notwendig oder einige Funktionen sind nahezu universell.
Im Folgenden werden fünf der gängigsten Betriebsarten beschrieben.
CLI-ModusCLI (Command Line Interface), die Befehlszeilenschnittstelle, PHP wird standardmäßig installiert. Über diese Schnittstelle können Sie in einer Shell-Umgebung mit PHP interagieren. Geben Siephp -v
in das Terminal ein und Sie erhalten ein Ergebnis ähnlich dem Bild unten (vorausgesetzt, PHP ist installiert):
Der FastCGI-Modus verwendet eine C/S-Struktur, die den WEB-Server und den Skript-Parsing-Server trennen und gleichzeitig einen oder mehrere Skript-Parsing-Daemons auf dem Skript-Parsing-Server starten kann. Jedes Mal, wenn der WEB-Server auf ein dynamisches Programm trifft, kann es zur Ausführung direkt an den FastCGI-Prozess übermittelt werden und das Ergebnis wird dann an den Browser zurückgegeben. Mit dieser Methode kann der WEB-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.
Außerdem muss im CGI-Modus nach einer Änderung der php.ini-Konfiguration von php-cgi der php-cgi-Prozess neu gestartet werden, damit die neue php-ini-Konfiguration wirksam wird, und ein reibungsloser Neustart ist nicht möglich. Im FastCGI-Modus kann PHP-FPM einen reibungslosen Neustart nach der Änderung von php.ini erreichen, indem ein neuer untergeordneter Prozess generiert wird.
PHP-FPM (PHP-FastCGI Process Manager) ist ein Prozessmanager, der das FastCGI-Protokoll in der PHP-Sprache implementiert. Es wurde von Andrei Nigmatulin geschrieben und implementiert. Es wurde offiziell von PHP integriert und in den Kernel integriert.
Vorteile des FastCGI-Modus:
Aus Stabilitätsgründen verwendet der FastCGI-Modus einen unabhängigen Prozesspool, um CGI-Protokollprogramme auszuführen, kann das System ihn problemlos verwerfen und dann neue Prozesse neu zuweisen ;
Aus Sicherheitsgründen unterstützt der FastCGI-Modus verteiltes Rechnen. Das FastCGI-Programm und der Host-Server sind völlig unabhängig und der Server wird nicht beeinträchtigt, wenn das FastCGI-Programm hängen bleibt.
Aus Leistungssicht trennt der FastCGI-Modus die Verarbeitung der dynamischen Logik vom Server Die E/A-Verarbeitung mit hoher Auslastung bleibt weiterhin dem Host-Server überlassen, sodass der Host-Server die E/A vollständig verarbeiten kann. Bei einer normalen dynamischen Webseite gibt es möglicherweise nur einen kleinen Teil der logischen Verarbeitung und einen großen Teil der statischen Bilder und so weiter.
Der FastCGI-Modus ist derzeit der gängige WEB-Dienst-Betriebsmodus von PHP. Er bietet eine effiziente und zuverlässige Leistung und wird jedem empfohlen.
Modulmodus
PHP wird oft mit dem Apache-Server gepaart, um eine LAMP-unterstützende Betriebsumgebung zu bilden. Die Integration von PHP als Submodul in Apache ist der Modulmodus. Die übliche Konfiguration in Apache ist wie folgt:
LoadModule php5_module modules/mod_php5.so
Hierfür wird der Befehl LoadModule
verwendet Modul. Der Name ist im Quellcode der Modulimplementierung zu finden. Die zweite Option ist der Pfad, in dem sich das Modul befindet. Wenn Sie das 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 Serverneustart. Dieses Modul wird gestartet, wenn Apache beginnt, Anfragen für PHP-Dateien zu akzeptieren, indem es sich beim ap_hook_post_config
-Hook von Apache2 registriert. LoadModule
命令,该命令的第一个参数是模块的名称,名称可以在模块实现的源码中找到。第二个选项是该模块所处的路径。如果需要在服务器运行时加载模块,可以通过发送信号 HUP
或者 AP_SIG_GRACEFUL
给服务器,一旦接受到该信号,Apache 将重新装载模块,而不需要重新启动服务器。通过注册到 apache2 的 ap_hook_post_config
挂钩,在 Apache 启动的时候启动此模块以接受 PHP 文件的请求。
例如,当客户端访问 PHP 文件时,Apache 就会调用 php5_module
php5_module
auf, um das PHP-Skript zu analysieren. Jedes Mal, wenn Apache eine Anfrage erhält, erstellt er einen Prozess, um eine Verbindung zu PHP herzustellen, um die Anfrage abzuschließen. Im Modulmodus wird PHP manchmal als Modul in Apache kompiliert, was es schwierig macht, festzustellen, ob ein Problem mit PHP oder Apache auftritt. 🎜In der Vergangenheit verwendeten Unternehmen Apache aufgrund seiner umfangreichen Module und Funktionen oft als WEB-Server, sodass die Kombination von PHP + Apache im Modulmodus sehr verbreitet war. In den letzten Jahren ist der Marktanteil mit dem Aufkommen asynchroner, ereignisgesteuerter Hochleistungs-Nginx-Server schnell gewachsen. Die im FastCGI-Modus ausgeführte PHP + Nginx-Kombination weist eine bessere Leistung auf und tendiert dazu, mit Apache aufzuschließen.
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 sich im Speicher befinden, nachdem sie durch eine Benutzeranfrage aktiviert wurde, und auf eine weitere Anfrage des Benutzers warten. Sie können auch mehrere Benutzeranforderungsverarbeitungsfunktionen in einer DLL einrichten. Darüber hinaus befinden sich die ISAPI-DLL-Anwendung und der WEB-Server im selben Prozess, und die Effizienz ist deutlich höher als die von CGI. Aufgrund der Exklusivität von Microsoft ist die Ausführung nur in der Windows-Umgebung möglich.
Es wird selten verwendet, daher werde ich es hier nicht im Detail vorstellen.
Empfohlenes Lernen: „PHP-Video-Tutorial“