简单来说,CGI和FastCGI只是一种协议,php-cgi是实现cgi的程序,php-fpm是管理php-cgi的管理器。CGI的全称是“CommonGatewayInterface”,是HTTP服务器与你或其他机器上的程序“对话”的一种工具,它的程序必须运行在网络服务器上。首先,CGI是干什么用的?CGI是为了保证web服务器传过来的数据是标准格式的,方便CGI程序的编写者。Web服务器(比如nginx)只是内容的分发者。例如,如果请求/index.html,Web服务器会在文件系统中找到这个文件并将其发送给浏览器,其中分布有静态数据。好吧,如果当前请求是/index.php,根据配置文件,nginx知道这不是一个静态文件,需要到PHP解析器去处理,那么它就简单处理请求,然后交给到PHP解析器。Nginx会将哪些数据传递给PHP解析器?必须有一个url、一个查询字符串、一个POST数据和一个HTTP标头。那么,CGI就是一个协议,规定了传输哪些数据,以什么格式传递给后方处理请求。仔细考虑您在PHP代码中使用的用户数据来自何处。当web服务器收到/index.php的请求后,会启动相应的CGI程序,也就是PHP的解析器。接下来,PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,将处理后的结果以CGI指定的格式返回,并退出进程。Web服务器然后将结果返回给浏览器。嗯,CGI是一个协议,和进程无关。那么什么是fastcgi呢?Fastcgi用于提高CGI程序的性能。FastCGI是在CGI的基础上发展和改进而来的。传统的CGI接口方式的主要缺点是性能较差,因为每次HTTP服务器遇到动态程序,都需要重启脚本解析器进行解析,然后将结果返回给HTTP服务器。提高性能,那么CGI程序的性能问题在哪里呢?“PHP解析器将解析php.ini文件并初始化执行环境”,就是这样。标准的CGI会为每个请求执行这些步骤(不累!启动过程很累!),所以每次处理的时间会比较长。这显然是不合理的!那么Fastcgi是怎么做到的呢?首先,Fastcgi会先启动一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求进来时,master将其传递给worker,然后worker可以立即接受下一个请求。这样一来,避免了重复劳动,效率自然就高了。而当worker不够时,master可以根据配置预先启动几个worker等待;当然,当空闲的worker过多时,会停止一些,这样既提高了性能又节省了资源。这就是fastcgi的进程管理。那么PHP-FPM是什么?它是一个实现Fastcgi的程序,被PHP官方接受。众所周知,PHP的解释器是php-cgi。php-cgi只是一个CGI程序。它只能解析请求并返回结果,但是不能管理进程(皇上,妃子真的不行!)所以出现了一些可以调度php-cgi进程的程序。例如,spawn-fcgi与lighthttpd分开。嗯,PHP-FPM也是这么个东西。经过长期的发展,逐渐被大家所认可,越来越受欢迎。PHP-CGI只是一个解释PHP脚本的程序。PHP-FPM是一个仅适用于PHP的FastCGI管理器,可从http://php-fpm.org/download...获得。参考:https://segmentfault.com/q/10...
