Shell脚本实现启动PHP内置FastCGI Server
2015-04-03 00:00
796 查看
前几天把工作平台从 Ubuntu 9.10 Karmic 更新到了 10.04 Lucid,由于 Lucid 官方源自带了 PHP5.3.2,以前使用的 dotdeb 的源就没法用了,一直很喜欢这个源的,不但提供了 PHP5.3 而且还有 php5-fpm 这个很实用的 fcgi 进程管理器,这个在官方源里面是没有的。强行上了 dotdeb 虽然也可以,不过必然有很多包会出现依赖问题,处理这些依赖关系是件很烦心的事情。哥啥都不怕,就怕麻烦~ :!:
对于 PHP 来说,php-fpm 还是最合适的,spawn-fcgi 这类东西就不用考虑了,我宁愿用 PHP5 内置的 FastCGI Server。
通过下面的命令启动服务器,监听 9000 端口:
好了,配合 nginx,可以继续开始工作了,但是你会发现每隔一段时间就会出现 502 Bad Gateway 错误,因为 php-cgi 进程处理的请求数达到最大(默认500)自动退出了。
你需要设置两个环境变量:
PHP_FCGI_CHILDREN – 派生子进程的数量
PHP_FCGI_MAX_REQUESTS – 每个子进程所能处理的最大请求数
配合这两个环境变量,启动内置的 FastCGI Server,保证 PHP 能够派生出子进程来负责处理请求,而不是由主进程来做。否则就会出现上面说的情况,达到 500 以后,自动退出。
下面是一个简单的脚本:
如何关闭呢?
可以一次性杀灭所有的 php-cgi 进程:
只弄死主进程也可以达到相同的效果,所有子进程也会随之消失:
对于 PHP 来说,php-fpm 还是最合适的,spawn-fcgi 这类东西就不用考虑了,我宁愿用 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脚本实现启动PHP内置FastCGI Server
- 启动 PHP 内置 FastCGI Server 的脚本
- 用popen实现在PHP代码异步调用服务器端的shell脚本
- PHP和Shell实现检查SAMBA与NFS Server是否存在
- shell脚本实现自动创建模拟器、启动模拟器、自动安装apk并进行monkey测试
- Shell实现的Oracle启动脚本分享
- 使用交互式shell脚本实现对DNS服务的管理以及启动
- Android自动化技术之自动monkey:shell脚本实现自动创建模拟器、启动模拟器、自动安装apk并进行monkey测试
- CentOS6.7下使用非root用户(普通用户)编译安装与配置mysql数据库并使用shell脚本定时任务方式实现mysql数据库服务随机自动启动
- linux环境下编写shell脚本实现启动停止tomcat服务的方法
- Shell脚本实现监控kingate并自动启动
- php调用shell脚本(web端和客户端同时实现)
- CentOS6.8 x86_64bit shell脚本实现模拟nginx服务启动与关闭
- php脚本 模拟实现 shell 脚本(任务计划)
- Shell脚本实现监控kingate并自动启动
- php-fpm开机自动启动Shell脚本
- 使用shell脚本检测lvs中realserver状态,并实现自动删除已挂机主机
- PHP和Shell实现检查SAMBA与NFS Server是否存在
- PHP内置Web Server探究(一)启动Cli_Server
- 用popen实现在PHP代码异步调用服务器端的shell脚本