如果我使用Ctrl+C退出在 CLI 中运行的 PHP 脚本,则不会处理关闭函数、实例化对象的析构函数,也不会处理任何输出缓冲区。相反,程序就死了。现在,这可能是一件好事,因为这就是Ctrl+C应该做的。但是有什么办法可以改变吗?是否可以强制Ctrl+C通过关机功能?
更具体地说,这是关于在脚本退出时序列化和保存数据,以便下次脚本运行时可以重新加载和恢复。定期保存数据可能会起作用,但从上次保存后仍然会丢失所有内容。还有哪些其他选择?
如果我使用Ctrl+C退出在 CLI 中运行的 PHP 脚本,则不会处理关闭函数、实例化对象的析构函数,也不会处理任何输出缓冲区。相反,程序就死了。现在,这可能是一件好事,因为这就是Ctrl+C应该做的。但是有什么办法可以改变吗?是否可以强制Ctrl+C通过关机功能?
更具体地说,这是关于在脚本退出时序列化和保存数据,以便下次脚本运行时可以重新加载和恢复。定期保存数据可能会起作用,但从上次保存后仍然会丢失所有内容。还有哪些其他选择?
显然 PCNTL 只是 *nix,但是......您可以为所有单独的信号注册处理程序以获得更强大的解决方案,但特别是在遇到 CTL+C 中断时执行某些操作:
<?php
declare(ticks = 1);
pcntl_signal(SIGINT, function() {
echo "Caught SIGINT\n";
die;
});
while (true) {
// waiting for your CTRL+C
}
看看PCNTL尤其是pcntl_signal()
我与@rdlowrey 的答案形成对比,我会避免使用普通函数while(true)
以及函数die/exit
中的pcntl_signal
函数,因为它不允许在循环被用户中断后处理事情。
相反,我想建议以下更合乎逻辑的解决方案:
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();