21,882
社区成员
发帖
与我相关
我的任务
分享
$signals = array(
SIGCHLD => "SIGCHLD",
SIGCLD => "SIGCLD",
SIGINT => "SIGINT",
SIGHUP => "SIGHUP",
SIGQUIT => "SIGQUIT",
);
if (version_compare(phpversion(), "5.3.0", "lt")) {
// tick use required as of PHP 4.3.0
declare(ticks = 1);
}
foreach ($signals as $signal => $name) {
if (!pcntl_signal($signal, array(&$this, "handler"))) {
die("Install signal handler for {$name} failed");
}
}
...
$mod_fd = stream_select($read,$write , $except , $tv_sec = 5);
public function handler($signo) {
Yii::log("handler {$signo} ",CLogger::LEVEL_INFO, __METHOD__);
switch(intval($signo)) {
case SIGCLD:
case SIGCHLD:
Yii::log("SIGCHLD sub proccess ",CLogger::LEVEL_TRACE, __METHOD__);
//正常退出
//declare = 1, that means one signal may be correspond multi-process die
while( ($pid = pcntl_wait($status, WNOHANG|WUNTRACED)) > 0 ) {
if (FALSE === pcntl_wifexited($status)) {
Yii::log("sub proccess {$pid} exited unormally with code {$status}",CLogger::LEVEL_WARNING, __METHOD__);
} else {
Yii::log("sub proccess {$pid} exited normally",CLogger::LEVEL_INFO, __METHOD__);
}
$this->_children--;
}
break;
case SIGINT:
case SIGQUIT:
case SIGHUP:
//异常退出
$this->_cleanup();
exit(0);
break;
default:
break;
}
}