PHP5.3.0起支持pcntl_signal系列進(jìn)程控制函數(shù)可以對信號進(jìn)行安裝、分發(fā)等操作。
信號處理函數(shù)
- pcntl_signal():安裝信號;
- pcntl_signal_dispatch():分發(fā)信號;
- pcntl_sigwaitinfo():等待信號;
信號類別
- SIGTERM:信號觸發(fā)命令:kill pid、kill -15 pid 、kill -SIGTERM等;
- SIGINT:程序終止(interrupt)信號,通常由ctrl+c觸發(fā);
- SIGKILL:觸發(fā)命令:kill -9 pid;
- SIGHUP:掛斷信號,通常父進(jìn)程終止后向子進(jìn)程組發(fā)送該信號;
- SIGALRM:定時器信號;
簡單案例
// 安裝信號
echo "開始安裝信號...\n";
pcntl_signal(SIGHUP, function($signal) {
echo "信號被調(diào)用!\n";
});
// 發(fā)出信號
echo "發(fā)出信號...\n";
posix_kill(posix_getpid(), SIGHUP);
// 分發(fā)信號
echo "開始分發(fā)信號...\n";
pcntl_signal_dispatch();
echo "完成\n";
/*
開始安裝信號...
發(fā)出信號...
開始分發(fā)信號...
信號被調(diào)用
完成
*/
復(fù)雜點(diǎ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);
}