php守护进程daemon

jack posted @ 2013年10月22日 19:30 in php with tags php DAEMON , 2345 阅读

项目中很多功能是php写的,其中一个数据解析模块需要一直运行,一开始是crontab方式批量执行,但是这样无法满足项目对于实时性的需求,需要将模块以服务方式运行。php可以像C一样创建守护进程。参考文章

//Run as daemon process.
function run()
{
    if(($pid1 = pcntl_fork()) === 0)
    {
        posix_setsid(); //Set first child process as the session leader.

        if(($pid2 = pcntl_fork()) === 0)
        {
            //Second child process, which run as daemon.
            speedbench_data_check(); 
        }
        else
        {
            //First child process exit;
            exit;
        }
    }
    else
    {
        //Wait for first child process exit;
        pcntl_wait($status);
    }
}

//Entry point.
run();

run函数负责将整个程序变为daemon process,方法和Unix环境下C的方法很类似,通过两次fork,第一次fork后调用setsid将子进程1变为session leader,这样就可以让子进程2与其祖先detach,即使祖先进程结束了它也会继续运行。

使用crontab监控并重启进程

#!/bin/bash
#check speedbench_data_daemon process and restart if down
DATE=`date -d "today" +"%Y-%m-%d-%H:%M"`
#用ps命令查看php speedbench_data_daemon.php进程
MM=`ps aux |grep "speedbench_data_daemon.php" | grep -v "grep" |wc -l`
#if语句判断进程是否存在,如果不存在,输出日志记录并重启speedbench_data_daemon
if [ "$MM" == "0" ]; then 
    echo "$DATE speedbench_data_daemon restart" >> path/to/speedbench_data_daemon.log
    path/to/php path/to/speedbench_data_daemon.php >> path/to/speedbench_data_daemon.log 2>>path/to/speedbench_data_daemon.log.wf
else
  echo "$DATE speedbench_data_daemon $MM ok"
fi 
blog comments powered by Disqus