FastCgi与PHP-fpm之间的关系

在网上搜索出来的博客,有的说fastcgi是一个协议,php-fpm实现了他。有的说,php-fpm是fastcgi进程的管理器。
有的说,php-fpm是php内核的一个补丁; 有的说,修改了php.ini配置文件后,没办法平滑重启,所以就诞生了php-fpm; 还有的说PHP-CGI是PHP自带的FastCGI管理器。

下面简单解释整个流程:

1.CGI是做什么的?
CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。
web server只做内容的分发。
eg:我们请求http://xxx.com/index.html这个请求,web server会找到系统的资源,在返回给浏览器,这个称为静态资源访问返回。当我们请求http://xxx.com/index.php请求时,首先web server去判断是否静态文件,根据配置文件知道这个不是静态文件,需要去找PHP解释器来处理,进过简单的处理后交给PHP解释器。
Web Server会把url,查询字符串,POST数据请求以及http header,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。

当Web Server收到http://xxx.com/index.php请求后,回启动相应的CGI程序,这里指的就是PHP解释器。接下来PHP解释器会去解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理结果,退出进程。Web Server在吧结果返回给浏览器。

2.FastCGI做什么?
FastCGI是CGI的升级版,一种语言无关的协议,就是用来提升CGI性能的

标准的CGI对每个请求都会执行上述的步骤,每个步骤的处理时间会相对比较长,为了避免这样的情况,
那么FastCGI是怎么工作的呢?
首先FastCGI会启动一个master,解析配置文件,初始化执行环境,然后在启动多个worker。
当请求过来时master会分配给一个worker,然后马上接受下一个请求。这样就避免了CGI重复的执行,
当worker不够用时,master可以根据配置多启动几个worker。

3.php-fpm做什么的?
他是一个实现了FastCGI的程序。

PHP解释器(php-cgi),他只是个CGI程序,自己本省只能解析请求,返回结果,不会去做管理进程方面的事儿,
所以就出现了能够调度php-cgi进程的程序php-cgi.
php-fpm的管理对象是php-cgi,但不能说php-fpm是FastCGI进程的管理器,他负责管理一个进程池,来处理来自Web服务器的请求。
对于php.ini文件的修改,php-cgi进程是没办法平滑重启的,有了php-fpm后,就把平滑重启成为了一种可能,php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就不工作了,通过这种机制来实现平滑过度。

仅有 1 条评论
  1. 哈哈哈哈哈哈哈哈哈哈或或或或或或

添加新评论