PHP信號處理

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);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容