通过Ctrl+;退出时的析构函数和关机功能;PHP-CLI中的C语言

通过Ctrl+;退出时的析构函数和关机功能;PHP-CLI中的C语言,php,Php,如果使用Ctrl+C退出在CLI中运行的PHP脚本,则不会处理关闭函数、实例化对象的析构函数或任何输出缓冲区。相反,这个程序只是死掉了。现在,这可能是一件好事,因为这是Ctrl+C应该做的。但有什么办法可以改变这一点吗?是否可以强制Ctrl+C执行关机功能 更具体地说,这是关于在退出脚本时序列化和保存数据,以便可以在下次脚本运行时重新加载和恢复数据。定期保存数据可能会起作用,但从上次保存起仍会丢失所有内容。还有什么其他选择吗?请特别关注一下显然,PCNTL只是*nix,但是。。。您可以为所有单个

如果使用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\U信号
功能中出现简单的
while(true)
以及
死亡/退出
,因为它不允许在用户中断循环后处理事情

相反,我想提出以下更符合逻辑的解决方案:

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

您考虑过尝试Ctrl+Z吗?我不知道这是否适用于PHP…我不确定Ctrl+Z应该做什么。我只是尝试了一下,但它似乎没有做任何事情,除了在下一个出现的提示中显示^Z字符(无论是
fgets(STDIN)
还是在Ctrl+C之后的新提示)我有一段时间没有使用PHP CLI了,但是有没有办法定期查看grab CLI输入并侦听特定的“kill”命令,然后启动解构器??您还可以在配置文件中为脚本设置一个“kill”标志,并定期检查该标志。看起来您在Windows上运气不好:啊,我应该提到我在Windows上……Doh!比尔·盖茨讨厌你!我不知道有什么方法可以在windows中实现这一点。。。