debug_backtrace() 从 PHP 中注册的关机函数

在修补这个问题的答案时,我发现当从内部调用时,它不会超出注册到的函数。debug_backtrace()register_shutdown_function()

这在 PHP 文档中的 register_shutdown_function() 的评论中提到过,指出:

您可能会想到从关机函数内部调用debug_backtrace或debug_print_backtrace,以跟踪发生致命错误的位置。遗憾的是,这些功能在关机功能中不起作用。

更详细地解释,对此答案状态的评论:

不起作用。关断功能在堆栈展开后发生。没有要转储的堆栈信息。

有没有办法绕过这一点,迫使PHP保留堆栈跟踪,直到进程完全终止,或者由于PHP内部,我们应该接受它作为给定的?


答案 1

这是一个非常昂贵的解决方案。我从未使用过register_tick_function()tick,我不确定它是否按预期工作。

declare(ticks=1);

function tick_handler() {
    global $backtrace;
    $backtrace = debug_backtrace();
}
register_tick_function('tick_handler');



function shutdown() {
    global $backtrace;
    // do check if $backtrace contains a fatal error...
    var_dump($backtrace);
}
register_shutdown_function('shutdown');

答案 2

有没有办法绕过这一点,迫使PHP保持堆栈跟踪

这是毫无意义的,当调用注册的函数时,所有定义的函数都已返回或已从堆栈中清除。

如果需要知道代码退出的位置,则需要检测代码。


推荐