是否可以确定哪个PHP文件生成了一些输出

时间:2014-03-28 14:18:35

标签: php

偶尔我会遇到一个问题,即大型系统某处的PHP文件在某些​​情况下会产生虚假输出。

这可能是因为某人在<?php开始标记之前意外输入了空格或其他字符,或者在最终结束后留下了不需要的调试echo或包含了一些空格{{1} } tag。

有没有办法生成一个日志,显示生成一些输出的所有PHP文件,以及它们生成的输出?

如果没有,是否有其他方法可以建议追踪我所描述的问题?

编辑:澄清一下 - 我正在运行的系统是Moodle(不是直接相关的,但是当它被问到......)而且,在这种情况下,输出是在DB升级期间(但我有类似的其他时间输出随机字符的问题)。有大量不同的PHP脚本被加载到内存中以生成页面,因此手动发现生成不需要的输出的脚本并不是一个非常诱人的前景......

2 个答案:

答案 0 :(得分:1)

如果您的“唯一”问题是php标签之外的文本token_get_all()可能对您有所帮助。 php标签外的所有内容(?)都报告为T_INLINE_HTML(312),因此很容易过滤。
E.g。

<?php
for($t=0;$t<10; $t++) { ?>

<?php
}
?>

<?php
$at = token_get_all( file_get_contents(__FILE__) );
foreach($at as $t) {
    if ( is_array($t) && T_INLINE_HTML===$t[0]) {
        echo 'inline html @ line ', $t[2], "\r\n";
    }
}

打印(一些空行和)

inline html @ line 3
inline html @ line 7

将其与get_included_files()RecursiveDirectoryIterator等内容相结合,您可以使用一些临时工具来完成任务。

答案 1 :(得分:0)

有几种方法可以做到,但除非你编写了代码,否则这是一项耗时的工作。确保打开错误报告,这可能也有帮助。

1)安装 Apachetop

此工具会扫描您的网络服务器日志文件,显示正在调用的文件,还有一些其他有趣的功能

2)使用lsof

watch -n1 "lsof | grep '\.php'"

上面的代码行只列出已打开的.php文件。如果文件快速打开和关闭,则可能无法列出

3)使用xdebug和xdebug profiler。

在运行代码时;同时检查xdebug探查器并继续刷新它。探查器的一个功能是它绘制了被调用文件的可视化映射。然后,您必须手动检查这些文件是否存在语法错误或错误/错误逻辑。如果您知道或者您已经制作了系统,那么您可以轻松地完成它。

我希望这会有所帮助