• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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

    您可能感兴趣的文章:
    • PHP+shell实现多线程的方法
    • php-fpm开机自动启动Shell脚本
    • Shell、Perl、Python、PHP访问 MySQL 数据库代码实例
    • Shell脚本中实现更新PHP5
    • PHP和Shell实现检查SAMBA与NFS Server是否存在
    • Ruby、PHP、Shell实现求50以内的素数
    • shell脚本联合PHP脚本采集网站的pv和alexa排名
    • php管理nginx虚拟主机shell脚本实例
    • 监控服务器swap并重启php的Shell脚本
    • PHP+shell脚本操作Memcached和Apache Status的实例分享
    上一篇:在 Shell 提示符中显示 Git 分支名称的方法
    下一篇:Putty实现自动登陆远程Linux主机的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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