CGI:
CGI(Common Gateway Interface)是一种协议用于规定Web Server(Apache2, Nginx)与php或者java等间进行交流的一种语言无关的协议。
这一点比较好理解,因为服务器软件Apache2, Nginx它们是不针对任何一种后台处理语言而设计的,那么就需要一种标准的协议来处理服务器软件与处理语言的接口,就是CGI。
FAST CGI:
CGI有很多缺点如下:
- 无需每个请求来都要读取php.ini文件来初始化运行环境
- 修改php.ini文件后无需停下业务进行重启
为了解决以上的这些缺点就提出了FAST CGI,同样的他也是一种协议。在PHP中使用的就是php-fpm,它的工作原理比较类似于LabVIEW FPGA里边的Compile farm与Compile worker之间的关系,php-fpm会根据请求来动态调度请求给php-cgi来解析用户的请求,并且维持一定数量的php-cgi来应对请求。它也解决了CGI的缺点2,当ini发生变化后启动的php-cgi会使用新的ini来配置运行环境。
工作流程:
- 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在此便退出了。
在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
参考资料:
https://segmentfault.com/q/1010000000256516
http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/