析构函数和关闭函数在 PHP-CLI 中按 Ctrl+C 退出时



如果我使用 Ctrl+C 退出在 CLI 中运行的 PHP 脚本,则不会处理关闭函数、实例化对象的析构函数或任何输出缓冲区。相反,程序只是死了。现在,这可能是一件好事,因为这是 Ctrl+C 应该做的。但是有什么办法可以改变这一点吗?是否可以强制 Ctrl+C 通过关机功能?

更具体地说,这是关于在脚本退出时序列化和保存数据,以便下次脚本运行时可以重新加载和恢复数据。定期保存数据可以工作,但从上次保存开始仍然会丢失所有内容。还有哪些其他选择?

显然 PCNTL 只是 *nix,但是......您可以为所有单个信号注册处理程序以获得更可靠的解决方案,但具体而言,在遇到 CTL+C 中断时要执行某些操作:

<?php
declare(ticks = 1);
pcntl_signal(SIGINT, function() {
    echo "Caught SIGINTn";
    die;
});
while (true) {
    // waiting for your CTRL+C
}

看看 PCNTL,特别是 pcntl_signal()

我与@rdlowrey的答案相反,我会避免普通while(true)以及pcntl_signal函数中的die/exit,因为它不允许在循环被用户中断后处理事情。

相反,我想建议以下更合乎逻辑的解决方案:

declare(ticks = 1);
$running = true;
pcntl_signal(SIGINT, function() {
    global $running;
    $running = false;
});
while($running)
{
    echo('running…'.PHP_EOL);
}
echo(PHP_EOL.'User interrupted the loop. Shutting down cleanly.'.PHP_EOL);
exit();

最新更新