一、我们先了解两个协议
CGI(Common Gateway Interface 通用网关接口)
web服务器与web程序之间的一种协议,可以使用任何语言编写,只需要遵守标准输入、输出和环境变量,如php,perl,python 等
FastCGI
同样是通信协议,CGI 升级版,因为CGI性能太差,在此之上做了一些优化。SCGI与此协议类似
二、对协议的具体实现
1.php-cgi
php自带的一种fastCGI协议实现,fork&excute模式 缺点:
1).想让php.ini生效,需要重启,不支持平滑启动
2).直接kill php-cgi进程会导致php无法运行
总而言之就是对fastCGI的一种实现,只不过实现的比较烂
2.php-fpm
一种改进版的fastCGI管理器,支持平滑启动,内存、CPU控制比较好,严格来说它不是fastCGI的进程管理器,因为它直接管理多个php-cgi 进程/线程,fastCGI是一种协议,不能直接被管理
三、webserver们如何与cgi交互
1.cgi模式
httpd接受到一个请求,fork个cgi进程,然后excute,返回给httpd进程后自我销毁
httpd->php-cgi->php
2.动态模块模式
将php_module(php-cgi模块)编译进httpd,httpd启动时自动加载对应模块
httpd->php_module->php
3.php-fpm模式
使用php-fpm控制php-cgi,此时httpd直接与php-fpm打交道,故可以将httpd与php-cgi分离部署
运行流程:
webserver 启动fastCGI进程管理器,等待连接
->fastCGI管理器选择一个cgi处理请求
->子进程处理完后返回结果至webserver
->关闭连接,子进程等待下次连接处理
CGI每次请求会解析php.ini,载入扩展,初始化结构数据,而FastCGI只会做一次
缺点:
多进程方式导致消耗内存,php-cgi解释器每次消耗7-25M内存
Nginx 0.8.46+PHP 5.2.14(fastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。
上面的数据摘自Nginx 0.8.x + PHP 5.2.13(fastCGI)搭建胜过Apache十倍的Web服务器(第6版)
参考文章
简单说明CGI和动态请求是什么 www.cnblogs.com/f-ck-need-u…
CGI、FastCGI和PHP-FPM关系图解 www.awaimai.com/371.html