PHP 中cgi,fastcgi,php-fpm的区别

1.CGI
CGI(Common Gateway Interface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位。CGI是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。因此我们可以把CGI当成一个协议或者”规则“,任何CGI程序(无论是php,python,node.js等)与任何的web server(apache,nginx等)进行通信时,必须遵守这项协议。
因此CGI协议是个标准,它与php没有半毛钱关系。

2.php-cgi
明白了上面的cgi协议以后我们再说php。我们通过http协议将自已的请求发送到目标服务器上,目标服务器的web server(比如nginx)接受我们的请求。如果我们请求的是一个php页面,那么web server肯定要把它丢给php的解析器去解析并产生结果,但是在这之前还有一个重要的程序,就是php-cgi。
PHP 中cgi,fastcgi,php-fpm的区别
php-cgi就是php与web server进行通信的实现了CGI协议的程序。
每当web server接受到请求后(请求php页面)会根据CGI协议将一些数据(比如环境变量)丢给php-cgi,php-cgi接受到请求后会把这些得到的数据初始化为php自己的数据,并调用php解析器解析。所以我们在程序一开始就有类似于SERVER,_POST等超全局数组,这些数据哪来的?是php-cgi从web-server那里拿来的。
3.fast-cgi
php-cgi有两种工作模式:(1)来一个请求我就产生一个php-cgi进程,等请求结束php-cgi程序也结束。这是传统的cgi模式。这个模式的缺点是效率低,因为php-cgi还要加载php.ini等信息,每一个新的请求都要fork一个新的进程(2)在内存常驻一定数量的php-cgi. 即我们所说的fastcgi模式,他的效率明显比较高。

说道这里重新梳理一下cgi与fastcgi
cgi是一个协议,但是好多人把它当作了php-cgi的运行的一种方式
fastcgi是php-cgi运行的一个方式。

4.php-fpm
我们现在知道了,php-cgi程序有一种运行方式是常驻内存的。php-fpm其实就是此种模式下的php-cgi程序的管理器,web server 一有请求不会再去找php-cgi了,而是去找php-fpm,然后php-fpm负责给请求分配php-cgi程序.除此之外,php-fpm还提供了很多其他的功能,但这不是这篇博客的重点,如有兴趣自行查阅。