如何在PHP的关机函数中检查退出是否干净?

7

如何在PHP的关闭函数中测试退出是否干净?

所谓干净的退出是指脚本没有因错误而终止。


5
“exit is clean”是什么意思?(原文已翻译) - Pekka
“清洁退出”是指关闭函数应该检查脚本是否结束,因为它已经执行完所有代码而不是因为遇到错误而停止吗? - Bailey Parker
有趣的是,我正在胡闹地尝试想出一些东西来回答这个神秘的问题,我发现当在已注册的关机函数中调用debug_backtrace()时,它不会跟踪到其后面的内容。 - Dan Lugg
1
在 PHP 中,exit() 函数可以带有状态码参数。这个状态码可以在另一个脚本中使用,例如当您使用 exec()passthru() 运行脚本时(甚至在使用多线程时也是如此)。 - y_a_v_a
4个回答

7

这是一个好问题,目前我只有这个想法:注册一个关机函数,像这样:

function shutdown() {
    if (defined('END_REACHED') {
        echo 'Script executed with no error', PHP_EOL;
    }
}

register_shutdown_function('shutdown');

使用auto_append_file,可以在每个脚本执行的末尾添加一个附加文件,该文件设置一个常量。

您的auto_append_file.php内容:

define('END_REACHED', TRUE);

如果您不想编辑php.ini文件,您可以在注册关机函数中检查error_get_last()$php_errormsg


+1,但如果可能的话,我更喜欢不需要修改php.ini的解决方案。 - agsamek
1
auto_append_file 也可以通过 .htaccess 进行修改。 - powtac
我不明白为什么会按照你的建议去做 - 除非你有条件地包含文件,否则它将在隐式主范围中被处理,因此定义将立即生效,而不是在执行完成时 - 使用include结构和内联设置标志/定义有什么区别? - symcbean
END_REACHED的定义总是附加在每个脚本的最后。据我所知,register_shutdown_function在一切处理完毕或发生错误时被调用。在第一种情况下,已达到定义,在第二种情况下则没有。 - powtac

1

脚本可能会提前终止的原因有很多,但没有通用的解决方案。唯一会导致脚本提前终止的错误是致命错误 - 在大多数情况下,致命错误发生后关机函数将不会运行,同样,自定义错误处理程序只能可靠地查看非致命错误。然后还有设置信号处理程序的选项 - 但它们只能看到部分故事。

当然,最重要的问题是,在关机函数中,您想要用这些信息做什么?

确定逻辑是否按预期完成的唯一可靠方法是在此发生时引发信号量,并在关机函数中进行检查。


今天有人给这个点了赞 - 上面的信息在2011年是正确的,但现在如果不调用关闭函数,就很难崩溃一个语法正确的PHP脚本。 - symcbean

1

调用 error_get_last() 可以告诉您是否发生了错误以及具体是哪种错误。如果该函数返回 NULL,则表示程序正常关闭。


0

我已经移植了(适用于PHP 5.3的)ezcExecution组件,可以很好地处理这个问题。请参见https://github.com/sobstel/Execution。基本上,您需要通知库退出是干净的(通过调用Execution::cleanExit())。否则,这意味着退出不干净。就这么简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接