1

我必须在一个大目录中递归搜索 xml 文件,并且必须测试它们是否包含特定标记“<运行>”。目前我将 RecursiveDirectoryIterator 与 RecursiveFilterIterator 一起使用,因为我认为新的 PHP SPL 将是最快的解决方案,但事实并非如此(不可能在 30 秒内计算出结果)——最快的方法是什么?递归全局?我没有足够的时间来测试/分析所有可能的方法来获取所有 xml 文件并测试它们是否包含此标记。

过滤器实现:

class MyRecursiveFilterIterator extends RecursiveFilterIterator {

public function accept() {

    if ($this->current()->isDir())
        return true;

    if (Utils::endsWith($this->current(), "xml")){

        $content = file_get_contents($this->current());

        if(strpos($content, "<run>") !== false)
            return true;

        return false;
    }

    return false;

}

}

捕获所有数组:

[..]
$result = array();

    try  {

        $dirItr    = new RecursiveDirectoryIterator($root);
        $filterItr = new MyRecursiveFilterIterator($dirItr);
        $itr       = new RecursiveIteratorIterator($filterItr, RecursiveIteratorIterator::SELF_FIRST);


        foreach ($itr as $filePath => $fileInfo) {
            if($fileInfo->isDir())
                continue;

            array_push($result, $filePath);

        }

    } catch (Exception $e) {
        die($e);
    }
[..]

有什么建议么?

编辑:

硬核linux版本只需要大约1或2秒!难道不能在php中实现类似的结果吗?!

$output = `find $root -type f -iname "*.xml" | xargs grep "<run>" --files-with-matches`;
$output = explode("\n", $output);

编辑 2: 找到了一个更快的 bash 版本:

 find path/to/files \( -name ".*" -prune -or \( -type f -and -name "*.xml" \) \) -and -not -name ".*" -exec grep -lsm 10 "^<" {} \+
4

0 回答 0