PHP5.3.0起支持pcntl_signal
系列进程控制函数可以对信号进行安装、分发等操作。
信号处理函数
pcntl_signal()
:安装信号;pcntl_signal_dispatch()
:分发信号;pcntl_sigwaitinfo()
:等待信号;
信号类别
SIGTERM
:信号触发命令:kill pid
、kill -15 pid
、kill -SIGTERM
等;SIGINT
:程序终止(interrupt)信号,通常由ctrl+c触发;SIGKILL
:触发命令:kill -9 pid;SIGHUP
:挂断信号,通常父进程终止后向子进程组发送该信号;SIGALRM
:定时器信号;
简单案例
// 安装信号
echo "开始安装信号...\n";
pcntl_signal(SIGHUP, function($signal) {
echo "信号被调用!\n";
});
// 发出信号
echo "发出信号...\n";
posix_kill(posix_getpid(), SIGHUP);
// 分发信号
echo "开始分发信号...\n";
pcntl_signal_dispatch();
echo "完成\n";
/*
开始安装信号...
发出信号...
开始分发信号...
信号被调用
完成
*/
复杂点案例
class Listener
{
public function __construct()
{
pcntl_signal(SIGTERM, array($this, "stop"));
pcntl_signal(SIGINT, array($this, "stop"));
pcntl_signal(SIGHUP, array($this, "sighup"));
pcntl_signal(SIGALRM, array($this, "alarm"), true);
set_error_handler(array($this, "errorHandler"));
}
public function errorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting
return;
}
switch ($errno) {
case E_WARNING:
throw new \Exception("PHP WARNING: [$errno] $errstr $errfile Line:$errline");
return true;
case E_NOTICE:
throw new \Exception("PHP NOTICE: [$errno] $errstr $errfile Line:$errline");
return true;
default:
break;
}
return false;
}
abstract function stop($signo);
}