所以场景是我有一个使用输出缓冲的应用程序,除了预期的结果之外,该应用程序还返回了一些额外的数据。我可以操纵将预期结果添加到输出缓冲区的点,以确认在应用程序的这一点上,发送到输出缓冲区的数据是正确的,因此意外的额外数据必须来自另一个来源。
我怀疑这个问题是一个不在 PHP 脚本标签内的杂散字符,但我没有运气弄清楚哪些(如果有)文件是罪魁祸首。据我所知,可能包含一些文件实际上正在echo
对额外数据进行显式处理。
所以我希望捕获写入输出缓冲区的任何文件的文件名和行号,但这证明比我预期的要困难得多。我知道首字母在哪里ob_start
,所以我一直在尝试使用自定义output_callback
. 以下是我已经尝试过的一些事情:
ob_start(function($string) {
return __FILE__ . ":" . __LINE__ . " : " $string;
});
这将返回定义函数的文件名和行号,而不是调用它的位置(正如预期的那样,我猜,但开始不好)。
ob_start(function($string) {
return print_r(debug_print_backtrace(), true) . " : " $string;
});
这会引发有关销毁 lambda 函数的错误。
ob_start(function($string) {
return var_dump(debug_backtrace()) . " : " $string;
});
这有好坏参半的结果。我承认我不完全确定为什么。但在大多数情况下,var_dump
解析为一个空字符串(什么都没有),但在一种情况下,它似乎生成了一些跟踪数组,但没有任何反映 ob_start 调用来源的东西(换句话说,无论它输出什么,实际调用的源文件echo
不是跟踪的一部分)。
请记住,根据上述内容,我一直在进行一些非常基本的测试,只是为了弄清楚output_callback
当我准备将其放入故障排除上下文时自定义函数会是什么样子。所以这个问题不是特定于应用程序的,我只是想找到一种通用的方法来拦截输出函数(echo、print 等)并获取有关输出调用起源的信息。