CGI、FastCGI、PHP-CGI与PHP-FPM的概念以及各个之间的关系

CGI、FastCGI、PHP-CGI与PHP-FPM的概念以及各个之间的关系

精选文章moguli202025-02-27 13:01:519A+A-

注意事项


必须明白 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-cgi
php-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处理完手上的活就可以歇着了,通过这种机制来平滑过度。

两张图片摘选自csdn 贝伦酱

点击这里复制本文地址 以上内容由莫古技术网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

莫古技术网 © All Rights Reserved.  滇ICP备2024046894号-2