留意事项
必须明确 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调度,只能一开始指定要起几个workerPHP-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 贝伦酱 |