PHP-Linux进程管理之信号处理

1.什么是信号

信号是一个消息,由操作系统或者应用程序发送到我们的程序里。信号是单向异步通知的机制,信号可以从内核发送到进程,也可以从一个进程发送到另一个进程,或者一个进程发送给自己。

2.操作系统支持的信号有哪些

linux平台可以通过kill -l查看信号列表,PS:并不是所有的信号都能在PHP里注册,比如SIGKILL就是不行的,试想下如果进程把kill -9的信号劫持,那进程岂不是关闭不了了?

3.PHP信号处理的流程

1.安装信号处理- pcntl_signal

2.发送信号- posix_kill

3.分发信号- pcntl_signal_dispatch (这边注意,如果没有分发的话,pcntl信号处理只支持declare(tick)的机制才能分发信号)

tick机制性能比较低,具体的可以参考韩天峰前辈写的介绍:http://rango.swoole.com/archives/category/php_system_program

4.处理信号-pcntl_signal(callback)

5.补充(libevent支持信号的处理)

4.代码演示

下面我就举一个父进程每隔10秒发送信号给子进程的例子。

<?php
$pid = pcntl_fork();

if ($pid == -1) {
    exit;
} else if ($pid) {

    function tick_handler()
    {
        global $pid;

        echo '每隔10秒向子进程发送信号' . time() . PHP_EOL;

        posix_kill($pid, SIGUSR1);
    }

    while (1) {
        sleep(10);
        tick_handler();
    }

} else {

    function sig_parent_handler($signo)
    {
        switch ($signo) {
            case SIGUSR1:
                echo '接收到来自父进程的信号SIGUSR1' . PHP_EOL;
                break;
            default:
                echo 'default' . PHP_EOL;
                break;
        }
    }

    pcntl_signal(SIGUSR1, 'sig_parent_handler');

    while (1) {
        echo 'child:'.time().PHP_EOL;
        
        usleep(1000*1000);
        
        pcntl_signal_dispatch();
    }

}

pcntl_waitpid($pid, $status, WUNTRACED);

<?php

function signal_handler($signal)
{
    echo $signal . PHP_EOL;
}

$eventBase = new EventBase();

$event = Event::signal($this->eventBase, SIGUSR1, ['signal_handler']);

$event->addSignal();

$eventBase->loop();
如无特殊说明,文章均为本站原创,转载请注明出处。如发现有什么不对的地方,希望得到您的指点。

发表评论

电子邮件地址不会被公开。 必填项已用*标注