declare( ticks = 1 );
// This case will check the config file regularly, if the config file changed, it will restart it self
// If you want to restart the daemon gracefully, give it a HUP signal
// by shiqiang<cocowool@gmail.com> at 2011-12-04
$job_flag = FALSE; //Job status flag, to justify if the job has been finished
$signal_flag = FALSE; //Signal status flag, to justify whether we received the kill -1 signal
while( 1 ){
$job_flag = FALSE; //Job status flag
print "Worker start running ... \n";
sleep(5);
print "Worker's task done ... \n";
$flag = TRUE; //Job status flag
AutoStart( $signal_flag );
}
function signal_handler( $signal ) {
global $job_flag;
global $signal_flag;
switch( $signal ){
case SIGQUIT:
print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGQUIT - No : $signal \n";
exit(0);
break;
case SIGSTOP:
print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGSTOP - No : $signal \n";
break;
case SIGHUP:
print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGHUP - No : $signal \n";
if( $flag === TRUE ){
AutoStart( TRUE );
}else{
$signal_flag = TRUE;
}
break;
case SIGALRM:
print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGALRM - No : $signal \n";
//pcntl_exec( '/bin/ls' );
pcntl_alarm( 5 );
break;
default:
break;
}
}
function AutoStart( $signal = FALSE, $filename = 'config.php' ){
global $init_md5;
if( $signal || md5_file( $filename ) != $init_md5 ){
print "The config file has been changed, we are going to restart. \n";
$pid = pcntl_fork();
if( $pid == -1 ){
print "Fork error \n";
}else if( $pid > 0 ){
print "Parent exit \n";
exit(0);
}else{
$init_md5 = md5_file( $filename );
print "Child continue to run \n";
}
}
}
参考资料:
1、PHP-Daemon
2、IBM Developers 系统调用跟我学
3、如何用PHP编写Daemon Process
4、Function exit
5、PHPDaemon
6、Stoping Gearman worker nicely
7、Doing the worker elsewhere