我必须在一个大目录中递归搜索 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 "^<" {} \+