CGI、FastCGI和PHP-FPM的区别

CGI:
通用网关协议,是web Server和运行其上的应用程序进行“交流”的一种约定。

把HTTP Request的Header设置成进程的环境变量,HTTP Request的正文设置成进程的标准输入,而进程的标准输出就是HTTP Response包括Header和正文。

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

以Nginx接收HTTP请求为例,Nginx接收一个HTTP请求后Fork创建出一个进程,将HTTP请求带来的参数作为输入,执行完程序处理后输出,最终会摧毁这个Fork出来的进程,并将输出返回给客户端。这种方式虽然简单,但是需要不断地Fork进程和销毁进程。
CGI、FastCGI和PHP-FPM的区别

FastCGI:

FastCGI是CGI的改进版,它是一个常驻内存的CGI服务。

而Fastcgi则会先fork一个master,解析配置文件,初始化执行环境,然后再fork多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是Fastcgi的对进程的管理。大多数Fastcgi实现都会维护一个进程池。

FastCGI的主要优点是把动态语言和HTTP服务器分离开来。如Nginx专一处理静态请求和向后转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。
CGI、FastCGI和PHP-FPM的区别

PHP-FPM
是一种FastCGI的后端实现,Fastcgi进程管理器,能够调度php-cgi进程的程序。