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

时间:2012-11-13 20:58:12

标签: php

如果我使用 Ctrl + C 退出在CLI中运行的PHP脚本,则不会处理关闭函数,实例化对象的析构函数或任何输出缓冲区。相反,该计划就此消亡。现在,这可能是一件好事,因为这就是 Ctrl + C 应该做的事情。但有什么方法可以改变它吗?是否可以强制 Ctrl + C 来完成关机功能?

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

3 个答案:

答案 0 :(得分:11)

显然PCNTL只是* nix,但是......你可以为所有单独的信号注册处理程序,以获得更强大的解决方案,但特别是在遇到CTL + C中断时做某事:

<?php
declare(ticks = 1);

pcntl_signal(SIGINT, function() {
    echo "Caught SIGINT\n";
    die;
});

while (true) {
    // waiting for your CTRL+C
}

答案 1 :(得分:2)

查看PCNTL,尤其是pcntl_signal()

答案 2 :(得分:1)

我与the answer by @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();