PHP中操作信号

场景:
使用PHP脚本做一个后台程序,不停地从队列中读取消息,并处理。

大致脚本:

while(1) {
$data = read_from_queue();
process_with($data);
}

然后就有了一个问题:当我们因为某些原因需要停止这个程序的时候,我们希望保证process_with($data)这个方法能够完整地执行完。也就是让while循环成为一个原子操作。

于是我用了信号来处理。主要是PCNTL函数。

于是程序被改成类似这样的:

// signal handler function
function sig_handler($signo)
{
     global $stop_flag;
     switch ($signo) {
         case SIGKILL:
         case SIGTERM:
             // handle shutdown tasks
             $stop_flag = true;
             break;
         case SIGHUP:
             // handle restart tasks
             break;
         case SIGUSR1:
             echo "Caught SIGUSR1...\n";
             break;
         default:
             // handle all other signals
     }

}

declare(ticks = 1);
$stop_flag = false;
// setup signal handlers
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP,  "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");

while(!$stop_flag) {
	$data = read_from_queue();
	process_with($data);
}

打完收功。

Copyright © 2010. All Rights Reserved.

发表评论

电子邮件地址不会被公开。 必填项已用*标注