PHP - PHP 7.0+ 中的 pcntl 问题。潜在的错误

PHP - Issue with pcntl in PHP 7.0+. Potential bug

我在 PHP 7.0+ 中遇到了 pcntl 信号处理问题。问题是在某些情况下没有安排警报。

以下示例适用于 PHP 5.6,但不适用于 PHP 7.0 或 7.1。

file.php

require_once('file2.php');

declare(ticks = 1);

// Add an alarm listener
pcntl_signal(SIGALRM, function() {
    var_dump("Triggered");

    // Re-schedule the alarm
    pcntl_alarm(5);
});

// Schedule the initial alarm
pcntl_alarm(5);

test();

file2.php

function test() {
    while(true) {
        sleep(2);
    }
}

在 PHP 5.6 和 7.0+ 中工作的代码片段。如果我们将代码合并到一个文件中,那么它就可以工作了。

declare(ticks = 1);

// Add a alarm listener
pcntl_signal(SIGALRM, function() {
    var_dump("here");

    // Re-schedule the alarm to be triggered
    pcntl_alarm(5);
});

// Set the initial alarm
pcntl_alarm(5);

function test() {
    while(true) {
        sleep(2);
    }
}

test();

此问题与 https://bugs.php.net/bug.php?id=71448#1463246578 有关。

7.1 中引入的

pcntl_async_signals() 解决了这个问题。