php pcntl_alarm - pcntl_signal处理程序不会触发?

时间:2016-10-28 00:07:54

标签: php timeout command-line-interface pcntl

我正在考虑使用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

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

1 2 3 4 5 6 Normal exit

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

1 个答案:

答案 0 :(得分:1)

SIGALRM是一个常数,你可以看到:

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";

您还需要使用检查未决信号 在你的循环中pcntl_signal_dispatch

.items()

古德勒克!