在修补this question的答案时,我发现当从register_shutdown_function()
内部调用时,debug_backtrace()
不会跟踪注册到register_shutdown_function()
的函数之外的内容。
在PHP文档中的register_shutdown_function()
的this comment中提到了这一点,声明:
您可能会想到从
函数内部调用debug_backtrace或debug_print_backtrace,以跟踪发生致命错误的位置。不幸的是,这些函数不能在shutdown函数中工作。
更详细地解释,关于this answer状态的评论:
不工作。关闭功能发生在堆栈展开之后。没有要转储的堆栈信息。
有没有办法绕过这一点,强制PHP保持堆栈跟踪,直到进程完全终止,或者我们应该因为PHP内部的原因而接受它?
发布于 2011-08-30 20:08:51
有没有办法绕过这一点,强制它保留堆栈跟踪
这是没有意义的,当调用已注册的函数时,所有已定义的函数都已返回或从堆栈中清除。
如果您需要知道代码退出的位置,那么您需要检测您的代码。
发布于 2011-08-30 18:43:33
这是一个非常昂贵的解决方案。我从未使用过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');
发布于 2011-08-30 18:43:06
根据我的经验,shutdown函数从一个干净的堆栈开始,它不能访问“原始”堆栈(因为那时它已经不存在了)。
不幸的是,没有办法保存原始堆栈。
https://stackoverflow.com/questions/7241834
复制相似问题