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

标签 php ubuntu php-7 ubuntu-16.04

我在 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 信号处理有很好的解释 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();

?>

关于PHP CLI pcntl 在 PHP7.0 Ubuntu xenial 服务器中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38715598/

相关文章:

php - 如何实现类型化/类型安全的迭代器?

php - Laravel - 如何通过 hasMany 中的相关属性进行排序

php - 在外部 php 函数中运行 mysql 查询

php - 使用链式方法和参数模拟调用

ruby - Rspec 套件无法在 ECONNREFUSED 的 AWS Ubuntu 上运行 - 但每个测试都单独通过

linux - 如何设置全局 nofile 限制以避免 "many open files"错误?

php - 使用 php 脚本保存数据并在发生错误时保留后变量

c++ - Ubuntu Qt 链接 boost 日志

php - 如何将从另一个命名空间导入的普通函数传递为可调用函数?

php - 在 PHP 7 中使用空合并运算符时,我可以用一些附加函数包装输入字段吗?