在修补this question的答案时,我发现从debug_backtrace()
内部调用register_shutdown_function()
后,{{1}}无法追踪注册到{{1}}的函数。
PHP文档中的this comment register_shutdown_function()
中提到了这一点,说明:
您可以从关闭函数内部调用debug_backtrace或debug_print_backtrace,以跟踪致命错误发生的位置。不幸的是,这些功能在关机功能中不起作用。
详细解释,对this answer州的评论:
不起作用。堆栈取消后会发生关闭功能。没有要转储的堆栈信息。
有没有办法绕过这个,迫使PHP保持堆栈跟踪直到进程完全终止,或者我们应该接受它作为给定的PHP内部结构?
答案 0 :(得分:15)
这是非常昂贵的解决方案。我从未使用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');
答案 1 :(得分:9)
有没有办法绕过这个,迫使PHP保持堆栈跟踪
这是没有意义的,当调用注册函数时,所有已定义的函数都已从堆栈中返回或清除。
如果您需要知道代码退出的位置,那么您需要检测代码。
答案 2 :(得分:4)
根据我的经验,shutdown函数以一个干净的堆栈开始,它无法访问“原始”堆栈(因为它不再存在)。
不幸的是,没有办法保存原始堆栈。
答案 3 :(得分:4)
在XDebug扩展程序中,有一个xdebug_get_function_stack()
功能。
这个类似于PHP的内部debug_backtrace()
,但即使在关闭处理程序中也能保持跟踪。
你不会得到确切的退出点,只有最后执行的功能才会发生关闭(由die()
/ exit()
调用或错误触发)。
这当然只适用于开发环境。
答案 4 :(得分:0)
在您已注册的关闭功能中,您可以通过error_get_last函数获得追溯。在PHP7中对我有效。