最近被PHP-FPM难倒了,搜索资料后,谈谈我自己大致的理解。

服务器在处理一个静态页面的时候的流程大致如此

若是客户请求一个动态页面呢?.jsp、.php、.asp等

 

①CGI和PHP-CGI

CGI(Common GateWay Interface)公共网关接口。它是一个协议,保证webserver传递给CGI程序(基于CGI协议规范编写的程序)的数据是标准格式。所以不同的动态语言(PHP,JAVA,Python等),它都有自己满足CGI协议规范开发的CGI程序,相当于实现了一个接口。请求Python页面,webserver就找用Python编写的CGI(.py)程序去处理、请求PHP页面,就找PHP的CGI程序PHP-CGI(PHP解释器)去处理。

例子:PHP-CGI处理一个index.php页面

浏览器请求一个index.php,因为是动态页面,所以Nginx需要交由PHP来处理,这时需要PHP满足CGI协议开发的CGI程序(PHP-CGI)进行处理,PHP处理完也必须以CGI协议规定的格式返回处理的结果给Nginx,最后Nginx再将这些信息返回给浏览器。

②FastCGI

FastCGI是用来提高CGI程序性能的。

看到上面的例子,普通CGI程序每次被Webserver开启,都会解析php.ini文件,进行初始化环境,处理完后就直接关闭了,下次又要启动进程,费时费力。

针对这个问题,FastCGI就来了,它首先启动一个master,然后解析配置文件,初始化环境,再启动多个worker,这些是常驻内存的,优点是响应非常快,缺点是多个请求的话,内存就一直被占满状态。请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。worker处理完后,不会关闭,等待master给他的下一个请求。且FasetCGI会动态调整worker的数量,空闲的worker太多,则会关闭一些、worker不够用,master继续启动多点worker。这就是FastCGI对每个CGI程序进程的一个管理。

③PHP-FPM(FastCGI Process Manager)

而PHP-FPM实现了FastCGI协议,类似与①中基于CGI协议的PHP-CGI程序。PHP-FPM相当于②中的master 、PHP-CGI相当于worker 。spawn-fcgi也是类似的管理器,不过PHP-FPM在CPU和内存方面更优,所以PHP-FPM就成主流了。

例子:

OK,那么小的讲完,我们再跳出来回顾整个WebServer的启动,接受请求,响应请求的过程。

整个流程

看着上面的图,然后思考下面的流程

  1. Web Server启动时载入FastCGI进程管理器(Apache Module或IIS ISAPI等)
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(比如php-cgi),并等待来自Web Server的连接。
  3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi
  4. FastCGI子进程完成处理后,将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待,并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在普通CGI模式中,php-cgi在此便在内存中销毁了。

 

注意:

PHP-FPM实现了PHP的平滑重启,即修改了php.ini文件后,现在不需要重启服务器,PHP-FPM将新的请求发送给PHP-CGI的时候,是应用新的配置,而正在运行的PHP-CGI则是使用旧的,然后当这个PHP-CGI运行处理完数据后,等待下一次PHP-FPM分配给新的请求,则这时候就应用了新的配置,这就是平滑升级。

 

参考文章:https://www.cnblogs.com/iiiiher/p/5911419.htmlhttp://blog.csdn.net/belen_xue/article/details/65950658 ,https://segmentfault.com/q/1010000000256516

若您引用该文章的话,请您在您文章的最下方加上本页面的链接http://bayaojiu.com/blog/?p=449,谢谢。

您或许感兴趣

发表评论

电子邮件地址不会被公开。