假设你有一个大型PHP项目,突然间,当尝试运行它时,你最终会得到一个空白页。脚本终止,您希望以尽可能少的努力找到确切的位置。
是否有工具/程序/命令/IDE可以在PHP脚本终止时告诉您脚本退出的位置?
注意:我无法将自己的帖子标记为"已接受的答案",因此请查看底部以查看我的解决方案。如果你想出一个更好的解决方案,我会把你的帖子标记为答案。
我使用以下代码,不需要特殊的调试环境。请注意,这可能需要很长时间;您可以将刻度计数设置得更高 - 这样可以使其更快,但模糊。
function shutdown_find_exit()
{
var_dump($GLOBALS['dbg_stack']);
}
register_shutdown_function('shutdown_find_exit');
function write_dbg_stack()
{
$GLOBALS['dbg_stack'] = debug_backtrace();
}
register_tick_function('write_dbg_stack');
declare(ticks=1);
从 RoBorg 的非工作但仍然是正确的答案中获得一些灵感,我在开始时使用了以下代码:
function shutdown() {
global $dbg_stack_a;
print_r($dbg_stack_a);
}
register_shutdown_function('shutdown');
然后我创建了一个全局条件断点(全局 = 断点在每一行上计算),利用它可以通过 eval() 运行代码的事实,具有以下"条件":
eval('
global $dbg_stack_a, $dbg_stack_b, $dbg_stack_c;
$dbg_stack_a = $dbg_stack_b;
$dbg_stack_b = $dbg_stack_c;
$dbg_stack_c = debug_backtrace();
return false;
')
可能不快,但可以解决问题!使用它,我能够确定引发die()的确切文件和行位置。(此示例适用于 NuSphere。
grep -n die filename
不要忘记 grep 表示"exit"。
将此添加到文件顶部:
function shutdown()
{
print_r(debug_backtrace());
}
register_shutdown_function('shutdown');
参见register_ shutdown_function()
可以使用交互式调试器单步执行代码,直到到达退出点。除此之外,我认为您已经为exit|die
代码进行了 grep'ing .
xdebug 有一个很好的跟踪功能,可以让你看到你的 PHP 应用程序执行的所有整个跟踪,它应该给你关于你的出口在哪里的线索。
但是对于快速而肮脏的解决方案,如上所述的 grep/find 将正确完成。
同时检查 Apache error_log中 memory_limit
"错误的error___logs。
内存限制>= 10M 警告:(在 php.ini 文件中将其设置为 10M 或更大)
根据我的经验,发生这种情况时,脚本会突然结束,没有任何警告或通知。
确保错误显示在开发环境(而非生产环境)中。