MENU

PHP是如何与 Web Server 交互的

August 21, 2021 • Read: 1645 • PHP,编码

我们都知道 Web Server (Nginx/Apache) 本身只能处理静态文件,对于 PHP 这种动态语言是没办法处理的,所以我们需要借助其他的方式来使 PHP 与 Web Server 进行交互。

CGI

CGI (Common Gateway Interface)中文全称是“通用网关接口”,它的出现就是为了解决上面提到的 Nginx 与 动态语言交互的问题。由于CGI只是一个协议,可以使用任何一种语言编写,只要这种语言支持标准输入、标准输出、和环境变量。而PHP实现这个协议的程序就叫 “PHP-CGI”

Fast-CGI

Fast-CGI 是对 CGI 协议的一种改进,上面提到的 CGI 协议动态语言的交互了,但每一次请求都会 fork 一个 CGI 的进程,请求结束再 kill 掉这个进程。如果请求多的话,就会反复的 fork、kill PHP-CGI 进程很多次,造成很大的资源消耗。

于是出现了 Fast-CGI 这个协议,Fast-CGI 在每次请求处理完成之后,并不会 kill 掉这个进程,而会保留这个进程等待处理下次请求。不需要每次都 fork 一个新的进程,大大的提高了效率。

PHP-FPM

PHP-FPM 是对 Fast-CGI 的具体实现,启动后会有两种进程,一个是 master 主进程,和多个 CGI 子进程,主进程负责管理这个子进程,而子进程负责PHP的处理。如果子进程挂掉了,则 master 会启动一个新的子进程,除此之外,PHP-FPM 还有其他的管理功能、例如:修改 php.ini 后平滑重启,具体可以参考官方文档:https://www.php.net/manual/zh/install.fpm.php

Apache Mod

PHP 与 Web Server 传递数据的另一种方法就是通过 PHP Module 加载方式。就是将 PHP 作为 Apache 的子模块来运行,当通过 Web 请求 PHP 文件时,Apache 就会调用 php5_module 来解析 PHP 代码。

Apache -> httpd -> php_module -> sapi -> php

这种实现会有上面提到的 CGI 一样的问题,每一个请求都会产生一个新的进程来处理 PHP 的请求,并发一旦多了,服务器就会承载不住。

(由于Fast-CGI可以长时间保持运行,所以可以做PHP数据库链接持久化,不需要每次处理 PHP 请求都链接一次数据库。官方文档:https://www.php.net/manual/zh/features.persistent-connections.php

PHP 的 SAPI

SAPI 是 PHP 内核提供的一个与外部通讯的一个接口,类似与 Socket。使PHP可以与其他应用进行数据交互 (Apache、Nginx)。PHP 默认提供了很多中 SAPI,常见的有 php5_module、CGI、FastCGI、IIS 的 ISAPI、Shell 的 CLI。


参考文档:

Last Modified: September 12, 2021
Leave a Comment

2 Comments
  1. 佛挡杀佛 佛挡杀佛

    能把cent更新下吗

    1. @佛挡杀佛我也想更新啊,我只是官网作者。不是百分作者,百分营收能力有限,更新动力不是很强。毕竟人也是要吃饭的嘛。
      作者说:“9月1日之前内核更新到 92 的大版本”
      但个人感觉 可信度不高