Karp 的技术博客
PHP5.3.0起支持pcntl_signal系列进程控制函数可以对信号进行安装、分发等操作。

信号处理函数

  • pcntl_signal():安装信号;
  • pcntl_signal_dispatch():分发信号;
  • pcntl_sigwaitinfo():等待信号;

信号类别

  • SIGTERM:信号触发命令:kill pidkill -15 pidkill -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);
}

php

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2015年10月19日 03:11
9

目录

来自 《PHP 信号处理》