【问题标题】:PHP CLI pcntl not working in PHP7.0 Ubuntu xenial serverPHP CLI pcntl 在 PHP7.0 Ubuntu xenial 服务器中不起作用
【发布时间】:2016-12-07 12:32:38
【问题描述】:

我在 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 中运行良好,但是当尝试在 Ubuntu 16.04 中使用 PHP7.0 执行并尝试发送信号(杀死 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();

这段代码不会停止。

【问题讨论】:

  • 您发布的代码不会在 SIGTERM 上退出。所以在向它发送 SIGTERM 时它不应该停止。为什么它以前不起作用,这是正确的问题。
  • @ErkiA 我编辑了代码。在寄存器信号处理程序之后我有一个 for 循环。问题是信号被 stopSending() 捕获,但不打印 echo。
  • 您能否尝试创建一个最小的完整示例来演示该问题。目前您已经展示了一些我认为不相关的代码片段。可能,如果您尝试用最少的代码重新创建问题,您就会找到问题的原因。
  • 这对我来说适用于 PHP 7.0.9。
  • 将声明语句移动到文件的开头并在您的while循环中添加一些逻辑,例如“usleep(0)”。

标签: php ubuntu php-7 ubuntu-16.04


【解决方案1】:

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

<?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();

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多