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)) { 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); }
|