PHP的pcntl_signal_dispatch和posix_kill、pcntl_signal配合发送信号

先看下以下代码:

//注册SIGINT和SIGUSR2信号的响应
pcntl_signal(SIGINT, 'signalHandler', false);  //SIGINT : 2
pcntl_signal(SIGUSR2, 'signalHandler', false); //SIGINT : 12

function signalHandler($signal)
{
    echo "收到了信号:" . $signal;

    if ($signal == SIGUSR2) {
        echo "进行业务操作1" . PHP_EOL;
    } elseif ($signal == SIGINT) {
        echo "进行业务操作2" . PHP_EOL;
    }
    // 其他的else if逻辑...
}

while (true) {
    sleep(1);
    //调用该方法,信号处理函数才会被执行
    pcntl_signal_dispatch();
}

先解释下上面的代码的含义:

//官方手册解释如下:
bool  pcntl_signal( int $signo, callback $handler[, bool $restart_syscalls = true] )
函数pcntl_signal()为signo指定的信号安装一个新的信号处理器。 返回一个布尔值

首先pcntl_signal()函数,他是注册某一个信号与处理该信号的一个回调函数。那么信号是什么呢,也就是linux命令中:kill 命令后面的那个数字。可以用下面的方法查看所有信号:

root@ubuntu-virtual-machine:/var/www/html/test# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

我们常用的kill -9 杀死某个进程,其中这个9指的就是SIGKILL 。

所以上面的这段代码:

pcntl_signal(SIGINT, 'signalHandler', false); //SIGINT : 2

含义就是,当你输入的是SIGINT(也就是kill 2)时,他将使用回调函数"signalHandler( )",来处理逻辑。

而其中的while循环:

while (true) {
    sleep(1);
    //调用该方法,信号处理函数才会被执行
    pcntl_signal_dispatch();
}

其中的sleep(1),是为了减轻CPU的压力,毕竟该循环是一个死循环。而函数 pcntl_signal_dispatch();说明如下:

          bool pcntl_signal_dispatch ( void )

         函数pcntl_signal_dispatch()调用每个等待信号通过pcntl_signal() 安装的处理器。

其实就是调用上面写的那个回调方法“signalHandler()”,在调用该方法的同时,将从命令行输入的那个kill后面的那个数字当做参数传递到这个回调方法中(或者将posix_kill()方法中的信号,当做参数传递到这个方法中去),然后开始执行那个回调方法中的逻辑 。比如下面的这个代码块儿,就是传递的posix_kill()中的信号:

echo "安装信号处理器...\n";
pcntl_signal(SIGHUP, function ($signo) {
    echo "信号处理器被调用\n";
});

echo "为自己生成SIGHUP信号...\n";
posix_kill(posix_getpid(), SIGHUP);//posix_getpid()函数是获取当前进程号

echo "分发...\n";
pcntl_signal_dispatch();

echo "完成\n";

参考:https://blog.csdn.net/weixin_42075590/article/details/80740968

猜你喜欢

转载自blog.csdn.net/shj_php/article/details/89209937