PHP前端开发

## 使用 pcntl_async_signals(true) 时,为什么 pcntl_wait() 无法接收到信号?

百变鹏仔 2天前 #PHP
文章标签 信号

pcntl_async_signals 与 pcntl_wait 无法同时使用?

在使用 pcntl_async_signals(true) 时,程序中存在两种阻塞父进程的方式:while 循环和 pcntl_wait()。其中,while 循环可以正常接收到 sigterm 信号并运行回调函数,而 pcntl_wait() 则不行。原因如下:

while 循环方式

while 循环阻塞主进程,同时通过 usleep() 函数提供了一个定时检测信号的机会。当收到 sigterm 信号时,usleep() 会触发 tick,从而触发信号回调函数的执行。

pcntl_wait 方式

pcntl_wait() 同样可以阻塞主进程,但默认情况下,它的第三个参数为 true,表示不会中断程序执行并调用回调函数。

要解决此问题,可以将 pcntl_signal() 的第三个参数设置为 false,如下所示:

pcntl_signal(SIGTERM, [$this, 'masterTermHandler'], false);

通过设置第三个参数为 false,当收到 sigterm 信号时,程序将中断执行并调用回调函数。这样一来,pcntl_wait() 方式也能正常接收到 sigterm 信号并运行回调函数。