【PHP】什么是CGI、FastCGI和PHP-FPM

了解CGI,FastCGI,php-fpm三者区别前,需要先了解web server的工作流程。

web server工作流程

Web Server(如Nginx)只是内容的分发者。举个例子,如果客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据,如下图:
【PHP】什么是CGI、FastCGI和PHP-FPM
当web server收到动态php请求呢?
比如当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程
【PHP】什么是CGI、FastCGI和PHP-FPM

CGI

是 Web Server (Apache、Nginx、IIS、Lighttpd、Tomcat等服务器)与 Web Application (PHP、Java、Asp.net等应用程序)之间数据交换的一种协议。

FastCGI

同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。

FastCGI与CGI的区别

CGI针对每个http请求都是fork一个新进程来进行处理,处理过程包括解析php.ini文件,初始化执行环境等,然后这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求动态资源,那么web服务器又再次fork一个新进程,周而复始的进行。

Fastcgi则会先fork一个master,解析配置文件,初始化执行环境,然后再fork多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。

PHP-FPM

PHP-FPM是一个实现了Fastcgi协议的程序,用来管理Fastcgi起的进程的,即能够调度php-cgi进程的程序。