Shell脚本实现启动PHP内置FastCGI Server
程序员文章站
2022-06-02 08:42:10
前几天把工作平台从 ubuntu 9.10 karmic 更新到了 10.04 lucid,由于 lucid 官方源自带了 php5.3.2,以前使用的 的源就没法用了,一...
前几天把工作平台从 ubuntu 9.10 karmic 更新到了 10.04 lucid,由于 lucid 官方源自带了 php5.3.2,以前使用的 的源就没法用了,一直很喜欢这个源的,不但提供了 php5.3 而且还有 php5-fpm 这个很实用的 fcgi 进程管理器,这个在官方源里面是没有的。强行上了 dotdeb 虽然也可以,不过必然有很多包会出现依赖问题,处理这些依赖关系是件很烦心的事情。哥啥都不怕,就怕麻烦~ :!:
对于 php 来说, 还是最合适的,这类东西就不用考虑了,我宁愿用 php5 内置的 fastcgi server。
通过下面的命令启动服务器,监听 9000 端口:
复制代码 代码如下:
php-cgi -q -b 127.0.0.1:9000 &
好了,配合 nginx,可以继续开始工作了,但是你会发现每隔一段时间就会出现 502 bad gateway 错误,因为 php-cgi 进程处理的请求数达到最大(默认500)自动退出了。
你需要设置两个环境变量:
php_fcgi_children – 派生子进程的数量
php_fcgi_max_requests – 每个子进程所能处理的最大请求数
配合这两个环境变量,启动内置的 fastcgi server,保证 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=`which php-cgi`
## pid 文件路径
php_pid="/tmp/php.pid"
## 绑定 tcp 地址
fcgi_bind_address="127.0.0.1:9000"
## 绑定到 unix domain socket
#fcgi_bind_address="/tmp/php.sock"
## 派生出多少个 php 子进程
## 其中不包括主进程
php_fcgi_children=16
## 每个 php 进程处理的最大请求数
php_fcgi_max_requests=4096
## 用户
userid=verdana
################## no config below this line
# 根据用户不同,切换启动命令
if test x$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_children php_fcgi_max_requests=$php_fcgi_max_requests"
# 忽略其他的环境变量,以一个干净的环境启动
nohup env - $e sh -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 | grep php-cgi | awk '{print $1}' | xargs kill
只弄死主进程也可以达到相同的效果,所有子进程也会随之消失:
复制代码 代码如下:
cat /tmp/php.pid | xargs kill
上一篇: 糟糕,大意了
下一篇: Shell中的${}、##和%%使用范例