如何判断哪些 PHP 文件实际被使用,哪些没有? [关闭]

Posted

技术标签:

【中文标题】如何判断哪些 PHP 文件实际被使用,哪些没有? [关闭]【英文标题】:How to tell which PHP files are actually used and which are not? [closed] 【发布时间】:2011-01-24 10:46:19 【问题描述】:

我有一个大型 php 网站,我现在要处理它。它包含数百个单独的 PHP 文件,但我怀疑只有不到一半真正被使用。其中大部分可能都可以删除。

但我真正想做的最后一件事是检查每个文件的代码并检查其是否链接、包含、需要...等。给其他人或是否可以安全删除。

你知道是否有任何工具可以做到这一点?

【问题讨论】:

好问题,请记住,您可能无法捕获所有文件。因为您可以动态包含文件,而包含哪些文件可能取决于变量的状态。 也试试这个:php.net/inclued 我看不出为什么这个问题被搁置为题外话,而这个***.com/questions/1811421/… 问题却没有。此外,我发现以下大多数答案都有帮助,我将最适合我的答案标记为答案。 这个问题不应该跑题!很好的问题 我面临同样的问题,我有一个旧的系统文件夹,其中包含 3Gb 的文件,我假装在其中启动一个 GIT 存储库,这样我就可以处理那个烂摊子......但首先,我希望在那里是一种发现未被使用的文件的方法。 【参考方案1】:

看看phpxref,它可能会满足您的需求。

交叉引用 PHP 类、函数、变量、常量和 require/include 用法。

【讨论】:

这不会处理通过 eval 的调用。它也不会处理相互引用但没有外部引用的文件组。【参考方案2】:

使用自动化工具分析代码的问题在于,您可能会发现成批的文件相互链接,但这些文件从未被使用过。反之,可能有一个文件被直接访问,但不使用其他文件,也不被其他任何文件包含。

在绝望中,我通常会为每个文件添加日志记录。访问文件时将__FILE__ 简单地写入日志文件。这确实增加了全面的开销。但经过一定时间后,您的文件列表就会被实际访问和使用。

您还可以定期分析日志文件并从您知道已使用的文件中删除日志记录,从而减少开销。最后,您可以搜索仍然有您的日志记录代码的文件,以查看哪些尚未使用。

【讨论】:

测试覆盖率基本上为您添加了所有这些日志记录。自动地。看我的回答。【参考方案3】:

看看phpdcd

phpdcd 是 PHP 代码的死代码检测器 (DCD)。它会扫描 PHP 项目中所有声明的函数和方法,并将它们报告为至少没有被调用一次的“死代码”。

但不要指望它有什么奇迹。

【讨论】:

【参考方案4】:

有多种方法可以实现这一点,但都需要一些手动工作。

您最好安装和使用一个调试器(如 Xdebug),当您点击它们时,它可以显示 PHP 运行的路径。

另一种方法是编写一个匹配'include'、'include_once'、'require'、'require_once'的脚本。也可能检查“eval”和“fopen”、“file_get_contents”等。 确保您测试/备份。

【讨论】:

我刚刚意识到 - 任何 href=file.php 也是可能的匹配项!所以 script / grep 方法也应该考虑到这一点。【参考方案5】:

如果你使用测试覆盖率工具,它会告诉你哪些是肯定使用的, 对于您使用过的软件的任何功能。 (显然,你运动得越多 软件,它的非死部分执行的越多。)。这包括通过外部 html 链接访问的任何文件;当然,您必须使用该链接,因为它是您的应用程序功能的一部分。

然后您可以检查它说没有使用的那些,然后确定实际情况。

我们的SD PHP Test Coverage tool 将接受您希望签出的所有文件列表,并使您能够轻松收集此类测试覆盖率数据。它提供了一份总结报告,显示哪些文件有任何覆盖范围;那些覆盖率为 0% 的人可能已经死亡。

【讨论】:

它是否涵盖所包含的 PHP 脚本?那些通过 AJAX 动作调用的呢?我认为使用@Pekka 或@gordon 建议的工具在特定脚本中查找死代码会更合适。 @Eldros:如何调用脚本并不重要(包括,通过 AJAX)。放置在项目列表中的文件中的工具会注意到是否调用了脚本,并且同样会注意到脚本的调用不存在 @Eldros:仅通过检查源代码来确定答案的所谓“静态分析”工具不太可能准确。可以在运行时组装一个方法名并使用 eval 调用它;很少有静态分析技术(更不用说其他人作为答案列出的特定工具中的那些)可以确定这一点;所以他们可能会告诉你某些东西即使经常执行也没有被使用;他们可能会告诉您某些东西已被使用,即使它从未执行过。相比之下,测试覆盖率工具将始终正确地告诉您是否使用了,正如执行所证明的那样。 这个测试覆盖率工具适用于脚本:它只会告诉脚本被调用的频率,而不是特别是脚本的哪一部分被调用,对吗? @Eldros:它会在代码块级别准确地告诉您脚本的哪些部分被执行。摘要报告提供汇总,指示脚本整体是否也已执行。它不“计算”处决;这将使它成为一个分析器(我们也有用于 PHP 的计数和计时分析器工具)。见网站;有一个屏幕显示了一组脚本的覆盖范围。【参考方案6】:

您可以使用 __construct 方法,如果使用它,则记录它。创建实例后不能设置 __construct 方法。所以手动添加它们;

class Someclass
private $clsName;
public function __construct()
$this->clsName = get_class($this);
YourStaticLogger::yourlogFunction("whatever you want to log" . $this->clsName);

//other things

您只能跟踪被调用的类。这就是我会做的。

【讨论】:

这与“将日志记录添加到每个文件”的答案相同。 不错,但它不适用于抽象类和由子类扩展的父类,因为子类将覆盖父类的 __construct 方法,并且每个实例只会运行一个 __construct .

以上是关于如何判断哪些 PHP 文件实际被使用,哪些没有? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 PHP 文件被下载?有人可以通过哪些方式下载它们?

总结一些PHP文件函数有哪些

求助:PHP如何判断二维数组哪些竖列的值相同?

Xcode:如何快速判断哪些文件的行数超出了最大列限制?

如何判断你在 R 中使用了哪些包

判断循环语句都有哪些