首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >来自PHP中注册的关闭函数的debug_backtrace()

来自PHP中注册的关闭函数的debug_backtrace()
EN

Stack Overflow用户
提问于 2011-08-30 18:29:32
回答 5查看 9.5K关注 0票数 25

在修补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内部的原因而接受它?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-30 20:08:51

有没有办法绕过这一点,强制它保留堆栈跟踪

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

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

票数 9
EN

Stack Overflow用户

发布于 2011-08-30 18:43:33

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

代码语言:javascript
复制
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');
票数 17
EN

Stack Overflow用户

发布于 2011-08-30 18:43:06

根据我的经验,shutdown函数从一个干净的堆栈开始,它不能访问“原始”堆栈(因为那时它已经不存在了)。

不幸的是,没有办法保存原始堆栈。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7241834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档