4

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

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

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

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

有没有办法做到这一点?

4

4 回答 4

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
)
于 2013-09-16T05:46:47.957 回答
1

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

您可以尝试一些源分析器工具。看看这个相关的问答,例如:

于 2013-09-10T13:24:03.550 回答
0

只是前期:您没有在您的问题中写下您正在谈论的 PHP Eclipse 插件,所以我假设您正在谈论 PDT。

据我所知——它变得有点生疏了,因为我现在使用 PHPStorm——PDT 不可能开箱即用地包含文件取消引用。

这对于进行静态代码分析的任何事情通常也是如此,因为没有运行时上下文就无法解决许多事情。对于您给出的示例:

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

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

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

\.php['"]

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

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

于 2013-09-17T07:50:37.947 回答
0

我创建了一个简短的脚本,它将 grep 您的项目以获取未使用的 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
于 2013-09-16T18:37:39.157 回答