PHP CLI pcntl无法在PHP7.0 Ubuntu xenial服务器中工作


PHP CLI pcntl not working in PHP7.0 Ubuntu xenial server

我在PHP 5.5.9:中使用这个脚本

declare(ticks = 1);
pcntl_signal(SIGTERM, array($this, 'stopSending'));
pcntl_signal(SIGINT, array($this, 'stopSending'));
pcntl_signal(SIGUSR1, array($this, 'stopSending'));
pcntl_signal(SIGUSR2, array($this, 'stopSending'));
pcntl_signal(SIGQUIT, array($this, 'stopSending'));
pcntl_signal(SIGHUP, array($this, 'stopSending'));
public function stopSending($signals)
{       
    echo "hello";
    exit();
}
while (true) {
    // some logic
}

在Ubuntu 14中,这很好,但当尝试在带有PHP7.0的Ubuntu 16.04中执行并尝试发送信号(杀死PID)时,PHP CLI不会停止并继续运行。

在Ubuntu 16.04中,我检查pcntl扩展,这是可以的:

>php -m | grep pcntl
pcntl

运行时不会出现任何错误,但也不会停止(或显示回声)。

PHP7和pcntl有问题吗?

更新

问题是当将while循环封装到函数中时:

function start()
{
    while (true) {
        // some logic
    }
}
declare(ticks = 1);
pcntl_signal(SIGTERM, "stopSending");
pcntl_signal(SIGINT, "stopSending");
pcntl_signal(SIGUSR1, "stopSending");
pcntl_signal(SIGUSR2, "stopSending");
pcntl_signal(SIGQUIT, "stopSending");
pcntl_signal(SIGHUP, "stopSending");
function stopSending($signals)
{       
    echo "hello";
    exit();
}
start();

此代码不会停止。

这里对PHP信号处理有一个很好的解释。因此,确保信号处理程序在适当的时间触发的最佳方法是这样的:

<?php
declare(ticks = 1);
function start()
{
    while (true) {
        pcntl_signal_dispatch();
    }
}
pcntl_signal(SIGTERM, "stopSending");
pcntl_signal(SIGINT, "stopSending");
pcntl_signal(SIGUSR1, "stopSending");
pcntl_signal(SIGUSR2, "stopSending");
pcntl_signal(SIGQUIT, "stopSending");
pcntl_signal(SIGHUP, "stopSending");
function stopSending($signals)
{       
    echo "hello";
    exit();
}
start();
?>