PHP-FPM 是 PHP FastCGI 管理器,要了解 PHP-FPM,首先需要了解 CGI 和 FastCGI 的关系。

CGI

CGI 的英文全名是 Common Gateway Interface,即通用网关接口,是 web 服务器调用外部程序时所使用的一种服务器端应用规范。

早期的 web 通信只是将 web 服务器上的数据转发出去,这种情况下客户端每次获取的信息都是相同的(静态资源,图片,html)。随着 web 的发展,web 随呈现的内容更加丰富,仅仅通过静态资源已无法满足 web 通信的需求,所以引入 CGI 以便客户端请求能够出发 web 服务器运行另外一个外部程序,该程序运行结束将生成的 html 和其他数据通过 web 服务器返回给客户端(即动态请求,比如基于 PHP、Python、Java 实现的应用)。利用 CGI 可以针对用户请求动态返回给客户端各种各样动态变化的信息。

FastCGI

FastCGI 是 CGI 的升级版本,为了提升 CGI 的性能而生。
CGI 针对每个 HTTP 请求都会 fork 一个新进程来进行处理(解析配置文件、初始化执行环境、处理请求),然后把这个进程处理完的结果通过 Web 服务器转发给用户,刚刚 fork 的新进程也随之退出,如果下次用户再请求动态资源,那么 Web 服务器又再次 fork 一个新进程,如此周而复始循环往复。

FastCGI 则会先 fork 一个 master 进程,解析配置文件,初始化执行环境,然后再 fork 多个 worker 进程(与 Nginx 有点像),当 HTTP 请求过来时,master 进程将其会传递给一个 worker 进程,然后立即可以接受下一个请求,这样就避免了重复的初始化操作,效率自然也就提高了。而且当 worker 进程不够用时,master 进程还可以根据配置预先启动几个 worker 进程等着;当空闲 worker 进程太多时,也会关掉一些,这样不仅提高了性能,还节约了系统资源。

这样一来,PHP-FPM 就好理解了,FastCGI 只是一个协议规范,需要每个语言具体去实现,PHP-FPM 就是 PHP 版本的 FastCGI 协议实现,有了它,就是实现 PHP 脚本与 Web 服务器(通常是 Nginx)之间的通信,同时它也是一个 PHP SAPI,从而构建起 PHP 解释器与 Web 服务器之间的桥梁。

PHP-FPM

PHP-FPM 是 PHP FastCGI 管理器,用于接收 web server 的请求,可以有效的控制内存和进程,可以平滑重载php 配置。
PHP-FPM 负责管理一个进程池来处理来自 Web 服务器的 HTTP 动态请求,在 PHP-FPM 中,master 进程负责与 Web 服务器进行通信,接收 HTTP 请求,再将请求转发给 worker 进程进行处理,worker 进程主要负责动态执行 PHP 代码,处理完成后,将处理结果返回给 Web 服务器,再由 Web 服务器将结果发送给客户端。这就是 PHP-FPM 的基本工作原理。