php守护进程daemon
2013年10月22日 19:30
项目中很多功能是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