Shell脚本实现启动PHP内置FastCGI Server
前几天把工作平台从Ubuntu9.10Karmic更新到了10.04Lucid,由于Lucid官方源自带了PHP5.3.2,以前使用的dotdeb的源就没法用了,一直很喜欢这个源的,不但提供了PHP5.3而且还有php5-fpm这个很实用的fcgi进程管理器,这个在官方源里面是没有的。强行上了dotdeb虽然也可以,不过必然有很多包会出现依赖问题,处理这些依赖关系是件很烦心的事情。哥啥都不怕,就怕麻烦~:!:
对于PHP来说,php-fpm还是最合适的,spawn-fcgi这类东西就不用考虑了,我宁愿用PHP5内置的FastCGIServer。
通过下面的命令启动服务器,监听9000端口:
php-cgi-q-b127.0.0.1:9000&
好了,配合nginx,可以继续开始工作了,但是你会发现每隔一段时间就会出现502BadGateway错误,因为php-cgi进程处理的请求数达到最大(默认500)自动退出了。
你需要设置两个环境变量:
PHP_FCGI_CHILDREN–派生子进程的数量
PHP_FCGI_MAX_REQUESTS–每个子进程所能处理的最大请求数
配合这两个环境变量,启动内置的FastCGIServer,保证PHP能够派生出子进程来负责处理请求,而不是由主进程来做。否则就会出现上面说的情况,达到500以后,自动退出。
下面是一个简单的脚本:
#!/bin/bash
##参考:
##
## http://php.net/manual/en/install.unix.lighttpd-14.php
## http://kovyrin.net/2006/05/30/nginx-php-fastcgi-howto
##
##php-cgi的文件路径
PHPFCGI=`whichphp-cgi`
##PID文件路径
PHP_PID="/tmp/php.pid"
##绑定TCP地址
FCGI_BIND_ADDRESS="127.0.0.1:9000"
##绑定到Unixdomainsocket
#FCGI_BIND_ADDRESS="/tmp/php.sock"
##派生出多少个PHP子进程
##其中不包括主进程
PHP_FCGI_CHILDREN=16
##每个PHP进程处理的最大请求数
PHP_FCGI_MAX_REQUESTS=4096
##用户
USERID=verdana
##################noconfigbelowthisline
#根据用户不同,切换启动命令
iftestx$UID=x0;then
CMD="/bin/su-m-c\"$PHPFCGI-q-b$FCGI_BIND_ADDRESS\"$USERID"
else
CMD="$PHPFCGI-b$FCGI_BIND_ADDRESS"
fi
echo$CMD
#相关的环境变量
E="PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDRENPHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS"
#忽略其他的环境变量,以一个干净的环境启动
nohupenv-$Esh-c"$CMD"&>/dev/null&
#记录PHP主进程的PID
#$!返回的是sh的PID
#找到所有php-cgi进程中最小的PID,就是主进程的PID
MASTER_PID=`ps-e|grep'php-cgi'|sed-n'1p'|awk'{print$1}'`
echo$MASTER_PID>"$PHP_PID"
如何关闭呢?
可以一次性杀灭所有的php-cgi进程:
ps-e|grepphp-cgi|awk'{print$1}'|xargskill
只弄死主进程也可以达到相同的效果,所有子进程也会随之消失:
cat/tmp/php.pid|xargskill