CGI与FastCGI

先说一个重要结论

  • nginx+PHP-FPM在高并发状况下可能会达到Apache+mod_php5的5~10倍,如今nginx+PHP-FPM使用的人愈来愈多。

CGI

  • CGI的英文是(COMMON GATEWAY INTERFACE)公共网关接口,服务器并不能直接运行 php,asp这样的文件,它的做用就是帮助服务器与语言通讯,这里就是nginx和php进行通讯,由于nginx和php的语言不通,所以须要一个沟通转换的过程,而CGI就是这个沟通的协议。
  • nginx服务器在接受到浏览器传递过来的数据后,若是请求的是静态的页面或者图片等无需动态处理的则会直接根据请求的url找到其位置而后返回给浏览器,这里无需php参与,可是若是是一个动态的页面请求,这个时候nginx就必须与php通讯,这个时候就会须要用到cgi协议,将请求数据转换成php能理解的信息,而后php根据这些信息返回的信息也要经过cgi协议转换成nginx能够理解的信息,最后nginx接到这些信息再返回给浏览器。

fast-cgi

  • 传统的cgi协议在每次链接请求时,会开启一个进程进行处理,处理完毕会关闭该进程,所以下次链接,又要再次开启一个进程进行处理,所以有多少个链接就有多少个cgi进程,这也就是为何传统的cgi会显得缓慢的缘由,所以过多的进程会消耗资源和内存。php

  • 而fast-cgi则是一个进程能够处理多个请求,和上面的cgi协议彻底不同,cgi是一个进程只能处理一个请求,这样就会致使大量的cgi程序,所以会给服务器带来负担。前端

php-cgi:

  • php-cgi是php提供给web serve也就是http前端服务器的cgi协议接口程序,当每次接到http前端服务器的请求都会开启一个php-cgi进程进行处理,并且开启的php-cgi的过程当中会先要重载配置,数据结构以及初始化运行环境,若是更新了php配置,那么就须要重启php-cgi才能生效,例如phpstudy就是这种状况。

php-fpm:

  • php-fpm是php提供给web serve也就是http前端服务器的fastcgi协议接口程序,它不会像php-cgi同样每次链接都会从新开启一个进程,处理完请求又关闭这个进程,而是容许一个进程对多个链接进行处理,而不会当即关闭这个进程,而是会接着处理下一个链接。它能够说是php-cgi的一个管理程序,是对php-cgi的改进。
  • php-fpm会开启多个php-cgi程序,而且php-fpm常驻内存,每次web serve服务器发送链接过来的时候,php-fpm将链接信息分配给下面其中的一个子程序php-cgi进行处理,处理完毕这个php-cgi并不会关闭,而是继续等待下一个链接,这也是fast-cgi加速的原理,可是因为php-fpm是多进程的,而一个php-cgi基本消耗7-25M内存,所以若是链接过多就会致使内存消耗过大,引起一些问题,例如nginx里的502错误。

同时php-fpm还附带一些其余的功能:

  • 例如平滑过渡配置更改,普通的php-cgi在每次更改配置后,须要从新启动才能初始化新的配置,而php-fpm是不须要,php-fpm分将新的链接发送给新的子程序php-cgi,这个时候加载的是新的配置,而原先正在运行的php-cgi仍是使用的原先的配置,等到这个链接后下一次链接的时候会使用新的配置初始化,这就是平滑过渡。

示意图

FastCGI的整个工做流程

  • Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
  • FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的链接。
  • 当客户端请求到达Web Server时,FastCGI进程管理器选择并链接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
  • FastCGI 子进程完成处理后将标准输出和错误信息从同一链接返回Web Server。当FastCGI子进程关闭链接时, 请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个链接。 在CGI模式中,php-cgi在此便退出了。
相关文章
相关标签/搜索