【发布时间】:2017-12-14 03:15:38
【问题描述】:
所以场景是我有一个使用输出缓冲的应用程序,除了预期的结果之外,该应用程序还返回了一些额外的数据。我可以操纵将预期结果添加到输出缓冲区的点,以确认在应用程序的这一点上,发送到输出缓冲区的数据是正确的,因此意外的额外数据必须来自另一个来源。
我怀疑问题是不在 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 等)并获取有关输出调用起源的信息。
【问题讨论】:
标签: php output-buffering debug-backtrace