必须明白 CGI 与 FastCGI 只是协议 没有进程 !
!
!
!
!
!
!
!
!
根本观点当Web Server收到 index.php 这个要求后,通过 web Server 的配置 知道只是一个动态要求会启动对应的 CGI 程序。这里便是PHP的解析器(PHP-CGI) 接下来PHP解析器会解析php.ini文件,初始化实行环境,然后处理要求, 再以CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。 这便是一个完全的动态PHP Web访问流程,接下来再引出这些观点,就好理解多了。
观点初识
CGI:是 Web Server 与 Web Application 之间数据交流的一种协议。FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。 同样,SCGI 协议与 FastCGI 类似。PHP-CGI:是 PHP (Web Application)对 Web Server 供应的 CGI 协议的接口程序。PHP-FPM: 是 PHP(Web Application)对 Web Server 供应的 FastCGI 协议的接口程序, 额外还供应了相对智能的一些任务管理。补充:可以说php-fpm不仅仅是用来在web server 和 php之间通信的fastCGI接口程序。 同样还是php的进程池管理工具。Web Server:一样平常指Apache、Nginx、IIS、Lighttpd、Tomcat等做事器,Web Application:一样平常指PHP、Java、Asp.net等运用程序。
CGI

观点CGI全称是“公共网关接口”(Common Gateway Interface),HTTP做事器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络做事器上。CGI可以用任何一种措辞编写,只要这种措辞具有标准输入、输出和环境变量。 事情事理 web做事器收到用户要求,就会把要求提交给cgi程序(如php-cgi),cgi程序根据要求提交的参数作应处理(解析php), 然后输出标准的html语句,返回给web服做事器,WEB做事器再返回给客户端, 这便是普通cgi的事情事理。 缺陷 每一次web要求都会有启动和退出过程,也便是每次都要花费韶光去fork一次 在互联网不发达的年代是可以的,但是在现在,互联网的时期 如果是高并发的情形下 可能就炸了
FastCGI
观点: Fastcgi是CGI的升级版,也是一种通信协议,它是用来提高CGI程序性能的。特点Fastcgi的特点是会在一个进程中依次完成多个要求,以达到提高效率的目的, 大多数Fastcgi实现都会掩护一个进程池。事情事理FastCGI会先启动一个master,解析配置文件,初始化实行环境,然后再启动多个worker。 当要求过来时,master会通报给一个worker, 然后立即可以接管下一个要求。 这样就避免了重复的劳动,效率自然是高。 而且当worker不足用时,master可以根据配置预先启动几个worker等着; 当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。
FASTCGI与CGI的差异:
在上书情形下,该当可能知道cgi 实行有多慢了,每次要求都要 解析php.ini 重新初始化利用FastCGI,所有这些都只在进程启动时发生一次。
关于上述协议的实现PHP-CGI
PHP-CGI是PHP自带的FastCGI管理器。它是php的阐明器。PHP-CGI只是个CGI程序,他自己本身只能解析要求,返回结果毛病:1.php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。如果杀去世进程。那php 就凉凉了2、不支持动态worker调度,只能一开始指定要起几个worker
PHP-FPM
PHP-fpm是针对付PHP的,Fastcgi的一种实现,他卖力管理一个进程池,处理来自Web做事器的要求。目前,PHP-fpm是内置于PHP的。众所周知 PHP的阐明器是php-cgiphp-cgi只是个CGI程序,他自己本身只能解析要求,返回结果,不会管理进程以是嘞 民间大佬 就研究出了 PHP-FPM 由于 太好用了 就在php 5.3之后 官方就将其并入官方包中php-fpm的管理工具是php-cgi,但不能说php-fpm是FastCGI进程的管理器,由于前面说了FastCGI是个协议他卖力管理一个进程池,来处理来自Web做事器的要求。对付php.ini文件的修正,php-cgi进程是没办法平滑重启的,有了php-fpm后,就把平滑重启成为了一种可能,php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度。
这是php-fpm 的流程图
这是普通的cgi的流程图
两张图片摘选自csdn 贝伦酱