Shell脚本实现启动PHP内置FastCGI Server

前几天把工作平台从 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 端口:

代码如下:

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

(0)

相关推荐

  • Shell脚本中实现更新PHP5

    我很迷恋 Shell,很喜欢看着字符在黑色的 Console 界面中跳跃着,奇怪的是,我居然没有因此成为一个 Linux/Unix 程序员,而只是个写 CGI 程序的倒霉蛋.大家都是怎么称呼 "PHP 程序员"的?对了--草根~ 嗯,在土里埋的太久,说不定哪天就烂掉了咯! 可能是被 Windows 惯坏了,实在不想换个 OS,还好有 Cygwin,MinGW - 之类的东西, 适当的时候,可以拿出来装下 B,自我安慰一下~ 我总喜欢从 windows.php.net 下载最新的 sna

  • php-fpm开机自动启动Shell脚本

    网上有各种版本的php-fpm开机自动启动脚本, 其实你编译后源目录已经生成自动脚本.不用做任何修改即用. cp {php-5.3.x-source-dir}/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm php-fpm开机自动启动脚本如下: #! /bin/sh ### BEGIN INIT INFO # Provides: php-fpm # Required-Start: $remote_fs $network # Required-Stop: $

  • shell脚本联合PHP脚本采集网站的pv和alexa排名

    这是给朋友写的脚本,是做cdn方面的,经常遇见攻击,但是不能一遇见攻击就把域名给封杀,我们可以有选择的进行判断. 这个是php取值alexa值得: 复制代码 代码如下: <?php $yuming = $argv[1]; //获取 alaxe 排名 function getAlexaRank($domain = www.jb51.net) { $line = ""; $data = ""; $url = "http://data.alexa.com/

  • PHP和Shell实现检查SAMBA与NFS Server是否存在

    通常会通过 /etc/fstab 来处理挂载的设置,然后再使用 mount -a 来重新确认挂载,最好在排程的程序用到挂载目录时也执行一次 mount -a,挂载目录在断线后是不会自动回复的,mount -a 的 Timeout 其实还蛮久的,尤其是 Server 不存在的时候,所以最好还是用对应的 client 先确认 server 是否存在. 而检查 NFS 的 client 可以用 showmount 来处理,在 Ubuntu 上的安装方式如下: 复制代码 代码如下: sudo aptit

  • Shell、Perl、Python、PHP访问 MySQL 数据库代码实例

    下午写了一个简单的 bash 脚本,用来测试程序,输入一个测试用例文件,输出没有通过测试的用例和结果,然后把结果保存到数据库里.如何在 bash 脚本里直接访问数据库呢?既然在 shell 里可以直接用 mysql 命令操作数据库,那么在 shell script 里也应该可以通过调用 mysql 来操作数据库.比如用下面的 bash shell 脚本查询数据库: Bash 复制代码 代码如下: #!/bin/bash mysql -uvpsee -ppassword test << EOFM

  • php管理nginx虚拟主机shell脚本实例

    本文实例讲述了php管理nginx虚拟主机shell脚本,分享给大家供大家参考.具体分析如下: 使用php作为shell脚本是一件很方便的事情.理所当然,我们可以使用php脚本来管理 nginx虚拟主机,下面是笔者的 脚本 文件供各位参考: 复制代码 代码如下: #!/usr/bin/php -q <?php   start: fwrite(STDOUT,"===========Vhost Script===========\n"); fwrite(STDOUT,"=

  • 监控服务器swap并重启php的Shell脚本

    折中一下,写个脚本监控swap吧,放在crontab里面,2小时执行一次,世界安静了,再也没有烦人的报警短信了 复制代码 代码如下: #!/bin/bash function usage {         echo "Usage: $0"         echo "e.g. $0 1500"         exit } if [ $# -lt 1 ];then         usage fi typeset -i nowSwap limitSwap limi

  • PHP+shell实现多线程的方法

    本文实例讲述了PHP+shell实现多线程的方法.分享给大家供大家参考.具体如下: 这里介绍如何借助shell脚本实现多线程. 先写个简单的php代码,这里为了让脚本执行时间更长,方便看效果,sleep一下,呵呵!先看下test.php的代码: PHP代码: <?php for ($i=0;$i<10;$i++) { echo $i; sleep(10); } ?> 在看下shell脚本的代码,非常简单 #!/bin/bash for i in 1 2 3 4 5 6 7 8 9 10

  • Ruby、PHP、Shell实现求50以内的素数

    ruby求50之内的素数的方法,感觉对比PHP和SHELL方法是最简单的,但SHELL中可以利用factor命令,而PHP中没有求素数的对应函数的,需要自己设计算法,三种方式大家对比学习下,应该还有更优更简单的方法的. 复制代码 代码如下: #encoding:utf-8 #求50以内的素数(注意数字中..与...的区别)   for i in 2..50 #1默认不为素数,所以从1-50范围内被排除     f=true #起始假定每个数都是素数     for p in 2...i #比自身

  • PHP+shell脚本操作Memcached和Apache Status的实例分享

    memcached 进程启动及监控 1.memcached_inc.sh 设置路径,端口等讯息. #!/bin/sh #config include HOST=$(hostname) SITE="mysite" PORT=11211 MEMCACHED_PID_FILE="/tmp/memcached.pid" MEMCACHED_DAEMON_PID_FILE="/tmp/memcached_daemon.pid" MEMCACHED=&quo

随机推荐