php pcntl_alarm - pcntl_signal 处理程序没有触发?

php pcntl_alarm - pcntl_signal handler doesn't fire?

我正在考虑使用 pcntl_alarm() 来做一些事情,所以为了测试它,我 运行 一个你在 google pcntl_alarm 时随处可见的例子的变体:

function signal_handler()
{
    echo "Caught SIGALRM\n";
    exit;
}
pcntl_signal('SIGALRM', 'signal_handler');

pcntl_alarm(3);

for($i = 1; $i <= 6; $i++) {
    echo "$i ";
    sleep(1);
}
echo "Normal exit\n";

预期输出:

1 2 3 Caught SIGALRM

实际输出:

1 2 3 Alarm Clock

我尝试在 pcntl_signal() 调用中不引用 SIGALRM(因为它需要一个 int),但是警报似乎没有触发:

1 2 3 4 5 6 Normal exit

我假设 Alarm Clock 输出是由默认处理程序引起的,而我的 signal_handler() 没有被调用。 SIGALRM 是正确的常量吗?我错过了什么?我在 linux (centos) 下通过 CLI 运行,已经尝试了 php 5.5 和 5.6。

SIGALRM 是一个常量,您可以通过以下操作看到:

echo SIGALRM; //14

您还需要使用以下方法检查未决信号 pcntl_signal_dispatch 在你的循环中。

function signal_handler()
{
    echo "Caught SIGALRM\n";
    exit;
}
pcntl_signal(SIGALRM, 'signal_handler');

pcntl_alarm(3);

for($i = 1; $i <= 6; $i++) {
    echo "$i ";
    sleep(1);
    pcntl_signal_dispatch();
}
echo "Normal exit\n";

祝你好运!