## 使用 pcntl_async_signals(true) 时,为什么 pcntl_wait() 无法接收到信号?
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 信号并运行回调函数。