确定 PHP 脚本退出位置的最快方法



假设你有一个大型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 或更大)

根据我的经验,发生这种情况时,脚本会突然结束,没有任何警告或通知。

确保错误显示在开发环境(而非生产环境)中。

最新更新