对cgi、php-cgi、fast-cgi、php-fpm最最最最最通俗的理解

皮景龙
2023-12-01
  • cgi:

早期的web服务器一般都只能处理静态资源,满足不了处理动态资源的需求,需要借助"java"、"php"等动态语言,这时候要与这些语言的解释器建立联系。"cgi"是应用程序(语言解释器)与Web服务器之间的接口标准。它("cgi")就是一个协议,规范了应用程序与web服务器(Apache、nginx)的通讯。


1:"cgi"是协议。
2:web服务器与应用程序的通讯标准。

 

  • php-cgi:

"php-cgi"是基于"cgi"协议,实现PHP脚本与web服务器通讯的应用程序

1:是一个可以执行php脚本应用程序(解释器)。
2:可以与服务器进行通讯。

 

注:

1.php脚本并不是一定要通过"php-cgi"才能执行,我们在命令行执行php脚本时,此处采用的是php内核提供的"cli接口"对php进行解析。

2."php-cgi"是基于"fast-cgi"协议实现的应用程序,虽然作为php官方自带的"cgi"管理器,但是却并不好用,主要体现在:

2.1:变更php.ini配置后,需重启"php-cgi"程序才能让新的php-ini生效,不可以平滑重启。
2.2:直接杀死"php-cgi"进程,php就不能运行了。(它是单进程的,一个进程处理一个请求,处理结束后进程就销毁)

 

  • fast-cgi:

"cgi"规范了服务器与解释器之间的通讯,但性能上存在着缺陷。
每当有请求发送给服务器时,php解析器会解析"php.ini"文件,加载相关扩展、初始化执行环境。
标准的"cgi程序"对每个请求都会执行这些步骤,所以处理的时间会比较长。
"fast-cgi"协议实现的应用程序,会先创建一个"主进程",解析配置文件,初始化执行环境;然后再创建多个"cgi解释器进程"
当请求过来时,"主进程"会传递给一个"cgi解释器进程",让其对本次请求进行解析,自己(主进程)立即可以接受下一个请求。
而且当"cgi解释器进程"不够用时,"主进程"可以根据配置预先启动几个"cgi解释器进程"挂起;当空闲"cgi解释器进程"太多时,也会停掉一些。减少每次对环境的初始化、动态管理各个"执行进程",从而提高性能。

1."fast-cgi"是一个协议。
2.相较于"cgi"协议实现通讯,效率更高(有进程负责初始化环境、接收请求;有进程只管解析脚本)。

 

  • php-fpm:

"php-fpm" 是对 "fastcgi"协议的具体实现,相较于"php-cgi",他负责管理一个进程池,来处理来自Web服务器的请求。
因为"php-cgi"只是个"cgi"程序,他自己本身只能解析请求,返回结果,不会进程管理。所以就出现了一些能够调度 "php-cgi"进程的程序(php-fpm、spawn-fcgi...)。并且"php-fpm"通过生成新的子进程可以实现"php.ini"修改后的平滑重启。

1."php-fpm"是对于"FastCGI"协议的实现,是一个应用程序。
2.相较于"php-cgi",更加高效(平滑重启、不需要每次都初始化环境...)

 

 

 类似资料: