【问题标题】:Laravel console command catch signal from terminalLaravel 控制台命令从终端捕获信号
【发布时间】:2016-07-31 17:13:22
【问题描述】:

我正在尝试在终端中捕捉信号。我知道我可以使用pcntl_signal() 函数,但它对我不起作用。

我正在尝试使用此代码:

public function handle() {
    pcntl_signal(SIGINT, function ($signo) {
        echo "CATCH!\n";
        exit;
    });

    while (true) { echo("!\n"); sleep(2); }
}

当我按下Ctrl+C 时,我没有看到任何结果,因为程序仍在运行。我哪里错了?

我想在按下Ctrl+C 并调用__destruct() 方法后停止程序。

【问题讨论】:

  • 你需要关闭pcntl_signal(.....);你在什么操作系统下?
  • 你能用你实际运行的代码更新代码吗?您粘贴的将导致解析错误。
  • @IsmailRBOUH @jedrzej.kurylo 我忘了); - 我的大错

标签: php laravel console signals laravel-5.2


【解决方案1】:

如果文件中没有这一行,pcntl_signal() 函数将无法工作:

declare(ticks = 1);

它可能应该在文件的顶部,在类定义之前。

tick 是在程序执行期间定期发生的事件,在这种情况下,每个滴答都会触发程序检查传入的信号。我想。不知道为什么默认不启用,可能是运行时CPU负载增加?

我看到一些断言在 PHP 5.3 之后不推荐使用 tick,但我刚刚在 PHP 7.0.9 中进行了测试,可以确认没有它pcntl_signal() 将无法工作。

【讨论】:

  • 您可以在代码中的不同位置调用pcntl_signal_dispatch(),而不是declare(ticks = 1)。基本上,它会检查应用程序是否收到信号,如果收到,则分派使用pcntl_signal() 注册的信号处理程序。
【解决方案2】:

现在可以使用 Laravel SignalableCommandInterface 完成此操作

class MyCommand extends Command implements SignalableCommandInterface
{

    public function handleSignal(int $signal): void
    {
        echo "CATCH!\n";
        exit;
    }

    // Which signals will be handled
    public function getSubscribedSignals(): array
    {
        return [SIGINT, SIGTERM];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 2017-08-08
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多