在Eclipse中查看未使用的(未链接的和未包含的)PHP文件

时间:2013-09-06 15:08:09

标签: php eclipse eclipse-plugin dependencies

我有一个相当大的Ecplise项目,有超过2000个php文件,我怀疑它们中有很多没有被使用。

我想为所有其他文件中没有提到的php文件生成一个列表。 提到我的意思是:

  • include('file.php')
  • require_once('file.php')
  • $linktoimportantpage = "file.php"

因此,几乎所有文件都不包含该项目中任何其他文件名的字符串。

有没有办法做到这一点?

4 个答案:

答案 0 :(得分:3)

我写的这个脚本应该做你想要的。它将搜索项目中的所有PHP文件。然后它将搜索每个文件的内容以查找该文件名,如果文件名存在,显然您不想删除它,因此我们可以将其从数组中删除。然后,您将得到一个未在项目中“提及”的文件数组(该数组也将包含文件路径)。

首先让我们设置脚本:

$path = realpath('/path/to/your/files');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
$php_files = array();

接下来,循环将每个文件名添加到数组中,以便我们稍后搜索:

foreach ($objects as $name => $object)
{
    // only add php files to the array
    if($object->getExtension() !== 'php')
    {
                continue;           
    }

    $php_files[$name] = $object->getBasename();
}

再次循环,但这次搜索每个文件:

foreach ($objects as $name => $object)
{
    $path_parts = pathinfo($name);

    // again, only search php files to the array
    if($path_parts['extension'] == 'php')
    {
        // get the contents of each php file
        $file_contents = file_get_contents($name);

        // check each file name for an include
        foreach($php_files as $path => $filename)
        {
            // check if the file exist in this file contents
            if(strpos($file_contents, $filename) !== false)
            {
                // remove it from array if it exists in a file
                unset($php_files[$path]);
            }
        }
    }   
}

打印数组以查看哪些文件从未包含在内:

print_r($php_files);

这将以下列方式返回一个数组:

Array
(
    [/path/to/file1.php] => file1.php
    [/path/to/file2.php] => file2.php
    [/path/to/file3.php] => file3.php
)

答案 1 :(得分:1)

我不确定你是否可以在Eclipse中做到这一点(目前PHP插件并不是那么强大。)

您可以尝试一些源分析器工具。看看in this related Q&A,例如:

答案 2 :(得分:0)

我创建了一个简短的脚本,它将为你的项目提供未使用的php文件导入。

用法: /path/to/file.sh application/directory

确保脚本具有执行权限;例如:chmod 777 /path/to/file.sh

#!/bin/bash

MYPATH=$1

find "$MYPATH" -name \*.php -exec basename {} \; > /tmp/patterns

for p in $(cat /tmp/patterns); do
    grep -R $p "$MYPATH" > /dev/null || echo $p;
done

答案 3 :(得分:0)

就在前面:你还没有写过关于你正在谈论哪个PHP Eclipse插件的问题,所以我假设你在谈论PDT。

据我所知 - 它现在变得有点生疏,因为我现在使用PHPStorm - PDT不可能包含开箱即用的文件解除引用。

对于执行静态代码分析的任何事情,这通常都是正确的,因为如果没有运行时上下文,很多事情都无法解决。对于您给出的示例:

  • include('file.php')require_once('file.php')包含对相对于工作目录包含路径的文件的引用。两者在静态代码分析时都是未知的。大多数工具都可以从项目配置中获取包含路径,在PDT中这通常是构建路径。工作目录的问题通常只是通过期望工作目录是包含这些包含指令的文件所在的目录来“解决” - 但这根本不应该是真的。

  • $linktoimportantpage = "file.php"需要跟踪变量值评估。这在静态代码分析中是可能的,但只有非常高级的工具才能实现。我怀疑PDT确实支持这一点。

由于静态代码分析的前景似乎非常有限,以获取已使用文件的列表,我个人会根据文件名的模式进行基于正则表达式的搜索。这里所有文件都以.php结尾,通常用在字符串中,所以找到这些地方的正则表达式是:

\.php['"]

Eclipse PDT支持GUI内的文件搜索中的正则表达式。如今 - 即使我主要使用不同的IDE - 我个人会在commanline上这样做,因为它更灵活。这可以使用findgrep命令完成。它们带有自己的帮助页面并且易于使用。如果你正在使用windows,你可以为windows安装git-bash,它有一个包含所有有用的命令行工具的bash。

如果您需要更好的印象,可以使用名为inclued的分析器软件运行您的应用程序并监控所有包含。它是一个PECL包,它在PHP手册中有记录:http://php.net/inclued - 它非常直接使用,并且没有静态代码分析工具的缺点,因为它处理运行时信息。