基本定义
CGI:是 Web Server 与 Web Application 之间数据交换的一种协议
FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化
PHP-CGI 是 PHP (Web Application)对 Web Server 提供的 CGI协议的接口程序,实现了CGI接口协议的PHP脚本解析器
PHP-FPM:管理和调度 PHP-CGI 进程,进而实现了FastCGI接口协议的程序
联系与区别
CGI是为了保证web server传递过来的数据是标准格式的。webserver(比如说nginx)只是内容的分发者。当webserver收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器
Fastcgi是用来提高CGI程序性能的(Fast嘛)。每次 "PHP解析器会解析php.ini文件,初始化执行环境"会很慢,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。Fastcgi的特点是会在一个进程中依次完成多个请求,以达到提高效率的目的,大多数Fastcgi实现都会维护一个进程池。
PHP-CGI 是PHP自带的FastCGI管理器
PHP-CGI 的不足
1、php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启
2、直接杀死php-cgi进程,php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。)
所以出现了PHP-FPM
PHP-FPM 是php特有的一个fast-cgi管理器,Fastcgi的一种实现,他负责管理一个进程池,来处理来自Web服务器的请求。
webserver请求处理流程