SAPI
Le mode d'exécution PHP mentionné ici fait en fait référence à SAPI (Server Application Programming Interface, port de programmation d'application serveur). SAPI fournit une interface permettant à PHP de communiquer avec le monde extérieur. PHP utilise cette interface pour interagir avec d'autres applications. Pour différents scénarios d'application, PHP fournit également une variété de SAPI courants : apache, apache2filter, apache2handler, cli, cgi, embed, fast-cgi, isapi, etc.
php_sapi_name()
— Renvoie le type d'interface entre le serveur Web et PHP. Les valeurs renvoyées possibles incluent aolserver, apache, apache2filter, apache2handler, caudium, cgi (jusqu'à PHP 5.3), cgi-fcgi, cli, cli-server, continuité, embed, fpm-fcgi, isapi, litespeed, milter, nsapi, phttpd , pi3web, roxen, thttpd, tux et 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
De nombreuses implémentations SAPI intégrées à PHP ne sont plus maintenues ou sont devenues quelque peu non courantes. La communauté PHP envisage actuellement de retirer certaines SAPI de la base de code. La communauté considère que de nombreuses fonctionnalités se trouvent dans la bibliothèque PECL à moins qu'elles ne soient vraiment nécessaires ou que certaines fonctionnalités soient presque universelles.
Cinq des modes de fonctionnement les plus courants seront expliqués ensuite.
Mode CLICLI (Command Line Interface), qui est l'interface de ligne de commande, PHP sera installé par défaut. Grâce à cette interface, vous pouvez interagir avec PHP dans un environnement shell. Entrezphp -v
dans le terminal et vous obtiendrez un résultat similaire à l'image ci-dessous (en supposant que PHP soit installé) :
Le mode FastCGI adopte une structure C/S, qui peut séparer le serveur WEB et le serveur d'analyse de script, et démarrer un ou plusieurs démons d'analyse de script sur le serveur d'analyse de script en même temps. Chaque fois que le serveur WEB rencontre un programme dynamique, celui-ci peut être transmis directement au processus FastCGI pour exécution, puis le résultat est renvoyé au navigateur. Cette méthode permet au serveur WEB de traiter exclusivement des requêtes statiques ou de renvoyer les résultats du serveur de script dynamique au client, ce qui améliore considérablement les performances de l'ensemble du système applicatif.
De plus, en mode CGI, une fois la configuration php.ini de php-cgi modifiée, le processus php-cgi doit être redémarré pour que la nouvelle configuration php-ini prenne effet, et un redémarrage en douceur n'est pas possible. En mode FastCGI, PHP-FPM peut réaliser un redémarrage en douceur après une modification de php.ini en générant un nouveau processus enfant.
PHP-FPM (PHP-FastCGI Process Manager) est un gestionnaire de processus qui implémente le protocole FastCGI dans le langage PHP. Il a été écrit et implémenté par Andrei Nigmatulin. Il a été officiellement inclus par PHP et intégré au noyau.
Avantages du mode FastCGI :
Du point de vue de la stabilité, le mode FastCGI utilise un pool de processus indépendant pour exécuter les programmes du protocole CGI. Si un seul processus meurt, le système peut facilement le supprimer, puis réaffecter de nouveaux processus pour exécuter la logique.
Du point de vue de la sécurité, le mode FastCGI prend en charge l'informatique distribuée. Le programme FastCGI et le serveur hôte sont complètement indépendants, et le serveur ne sera pas affecté si le programme FastCGI raccroche
D'un point de vue performances, le mode FastCGI sépare le traitement de la logique dynamique du serveur, et le traitement des E/S à forte charge est toujours laissé au serveur hôte, de sorte que le serveur hôte puisse gérer les E/S sans réserve. Pour une page Web dynamique ordinaire, il peut y avoir seulement une petite partie du traitement logique et un grand nombre de statiques. des images et ainsi de suite.
Le mode FastCGI est actuellement le mode de fonctionnement des services WEB grand public de PHP. Il offre des performances efficaces et fiables et est recommandé à tout le monde.
Mode module
PHP est souvent associé au serveur Apache pour former un environnement d'exploitation prenant en charge LAMP. L'intégration de PHP en tant que sous-module dans Apache est le mode Module. La configuration courante dans Apache est la suivante :
LoadModule php5_module modules/mod_php5.so
Cela utilise la commande LoadModule
. module. Le nom peut être trouvé dans le code source de l’implémentation du module. La deuxième option est le chemin où se trouve le module. Si vous devez charger le module pendant que le serveur est en cours d'exécution, vous pouvez envoyer le signal HUP
ou AP_SIG_GRACEFUL
au serveur. Une fois le signal reçu, Apache rechargera le module. sans redémarrer le serveur. Ce module est démarré lorsqu'Apache commence à accepter les requêtes de fichiers PHP en s'inscrivant au hook ap_hook_post_config
d'Apache2. LoadModule
命令,该命令的第一个参数是模块的名称,名称可以在模块实现的源码中找到。第二个选项是该模块所处的路径。如果需要在服务器运行时加载模块,可以通过发送信号 HUP
或者 AP_SIG_GRACEFUL
给服务器,一旦接受到该信号,Apache 将重新装载模块,而不需要重新启动服务器。通过注册到 apache2 的 ap_hook_post_config
挂钩,在 Apache 启动的时候启动此模块以接受 PHP 文件的请求。
例如,当客户端访问 PHP 文件时,Apache 就会调用 php5_module
php5_module
pour analyser le script PHP. Chaque fois qu'Apache reçoit une requête, il crée un processus pour se connecter à PHP afin de compléter la requête. En mode Module, PHP est parfois compilé dans Apache en tant que module, ce qui rend difficile la détermination si un problème survient avec PHP ou Apache. 🎜Dans le passé, avec ses modules et fonctions riches, les entreprises utilisaient souvent Apache comme serveur WEB, donc la combinaison PHP + Apache fonctionnant en mode Module était très courante. Ces dernières années, avec la montée en puissance des serveurs Nginx asynchrones et hautes performances, la part de marché a augmenté rapidement. La combinaison PHP + Nginx fonctionnant en mode FastCGI a de meilleures performances et a tendance à rattraper Apache.
Mode ISAPI
ISAPI (Internet Server Application Program Interface) est un ensemble d'interfaces API pour les services Internet fournis par Microsoft. Une DLL ISAPI peut résider en mémoire après avoir été activée par une demande de l'utilisateur, en attendant une autre demande de l'utilisateur. Vous pouvez également configurer plusieurs fonctions de traitement des demandes utilisateur dans une seule DLL. De plus, l'application DLL ISAPI et le serveur WEB sont dans le même processus et l'efficacité est nettement supérieure à celle de CGI. En raison de l'exclusivité de Microsoft, il ne peut fonctionner que dans l'environnement Windows.
Il est rarement utilisé, je ne le présenterai donc pas en détail ici.
Apprentissage recommandé : "Tutoriel vidéo PHP"