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

确定PHP脚本退出位置的最快方法,php,Php,假设您有一个大型PHP项目,突然,当您试图运行它时,您只会得到一个空白页面。脚本终止,您希望尽可能轻松地找到它的确切位置 有没有工具/程序/命令/IDE可以在PHP脚本终止时告诉您脚本出口的位置 注意:我不能将自己的帖子标记为“已接受答案”,所以请查看底部以查看我的解决方案。如果你能想出一个更好的解决方案,我会把你的帖子标记为答案。别忘了用grep表示“退出”。将此添加到文件顶部: grep -n die filename function shutdown() { print_r(d

假设您有一个大型PHP项目,突然,当您试图运行它时,您只会得到一个空白页面。脚本终止,您希望尽可能轻松地找到它的确切位置

有没有工具/程序/命令/IDE可以在PHP脚本终止时告诉您脚本出口的位置


注意:我不能将自己的帖子标记为“已接受答案”,所以请查看底部以查看我的解决方案。如果你能想出一个更好的解决方案,我会把你的帖子标记为答案。

别忘了用grep表示“退出”。

将此添加到文件顶部:

grep -n die filename
function shutdown()
{
    print_r(debug_backtrace());
}


register_shutdown_function('shutdown');

请参见

您可以使用交互式调试器单步执行代码,直到到达退出点。除此之外,我认为您需要对
exit | die

xdebug的代码进行grep'ing,它有一个很好的跟踪功能,可以让您查看php应用程序执行的所有跟踪,并应该为您提供退出位置的线索


但是对于快速而肮脏的解决方案,上面提到的grep/find将正确地执行。

从RoBorg的非工作但仍然正确的方向答案中得到一些启发,我在开始时使用了以下代码:

function shutdown() {
    global $dbg_stack_a;
    print_r($dbg_stack_a);
}
register_shutdown_function('shutdown');
然后我创建了一个全局条件断点(global=breakpoint在每一行上都进行计算),利用它可以通过eval()运行代码的事实,使用以下“条件”:


也许不快,但却能成功!使用这个,我能够确定提升die()的确切文件和行位置。(此示例适用于NuSphere。)

还要检查错误日志,查看Apache错误日志中的“
内存限制”
”错误

内存限制>=10M警告:(在php.ini文件中将其设置为10M或更大)


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

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

我使用以下代码,不需要特殊的调试环境。注意,这可能需要很长时间;您可以将滴答数设置得更高,这样可以使滴答数更快,但更模糊

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);

以后,请确保死()时带有消息;-)是 啊这通常是个好主意,或者使用异常处理。虽然我自己没有写过很多代码,但我还是在用这些代码工作。。。x/不起作用。关闭功能在堆栈解除锁定后发生。没有要转储的堆栈信息。是的,如果PHP在调用它之前没有清除堆栈跟踪,这正是我想要的…
if(extension_loaded('xdebug')){$backtrace=xdebug_get_function_stack();}
在内部工作shutdown@myself:虽然
xdebug\u get\u函数\u stack
在关闭后工作。这里没有提到exit callGood答案,但是我正在寻找一个通用的解决方案(对于任何类型的exit),而不仅仅是查找die()。同时假设这个项目有很多的死和出口,仔细检查它们将是一项极其乏味的任务在实际的冒犯页面上,哪一种违背了目标。如果只在已添加代码块的文件上添加它,那么它将只监视该文件上的记号,而不监视可能已包含的任何其他文件上的记号。因此,为了解决这个问题,编写一个脚本,循环遍历每个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);