CGI,FastCGI,PHP-CGI与PHP-FPM

转自:http://www.nowamagic.net/librarys/veda/detail/1319

CGI(通用网关接口),是HTTP服务器与其他机器进行通信的工具(一直没搞懂),只知道它能解释并执行PHP。

FastCGI是CGI的一种,克服CGI每次都要fork一个进程加载解释器导致性能下降的缺点,能够常驻内存,并接受FaseCGI进程管理的调度。在fastcgi出现以前,cgi不需要提前启动,而是nginx负责启动,没当有请求到达nginx后,nginx自己fork一个cgi进程来处理请求。

PHP-CGI和PHP-FPM和spawn-cgi都是FastCGI进程管理器,监听9000端口(可以自定),接受来自服务器转发过来的请求并指定一个cgi来处理。有些服务器中已经集成(apache),但有的服务器(nginx)没有集成,需要手动配置。php-cgi是php自带的,php-fpm作为编译选项加入php,spawn-cgi是通用的。

1.FastCGI的工作原理:

1)Web Server启动时载入FastCGI进程管理器(PHP-CGI或者PHP-FPM或者spawn-cgi)

2)FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。

3)当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

4)FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出。

2.FastCGI的不足:

因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。

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版)

/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi  

-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置
-a <addr> 绑定到地址addr
-p <port> 绑定到端口port
-s <path> 绑定到unix socket的路径path
-C <childs> 指定产生的FastCGI的进程数,默认为5(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,Ubuntu下可以使用www-data,其他的根据情况配置,如nobody、apache等

3.直接使用php-cgi的FastCGI运行方式有两个问题:

  1)如果进程崩溃,难以配置重新启动

  2)单进程的效率低

php-cgi -b 127.0.0.1:9000   //使用php自带的php-cgi直接运行 

4.使用php-fpm管理fastcgi进程

要想使用php-fpm 需要在编译php的时候 加入--enable-fpm 像这样 ./configure --prefix=/usr/local/php --enable-fpm php安装完成后 fpm的配置文件位于 /usr/loca/php/etc/php-fpm.conf.deafult 将.deafult去掉 作为php-fpm的配置文件 使用命令行 php-fpm -t来测试配置文件是否正确 php-fpm的路径 /usr/local/php/sbin/下