我必须在大型目录中递归搜索xml文件,并且必须测试它们是否包含特定标记'<运行>'。目前我使用RecursiveDirectoryIterator和RecursiveFilterIterator,因为我认为新的PHP SPL将是最快的解决方案,但它不是(它不可能在30秒内计算结果) - 最快的方法是什么?一个递归的glob?我没有足够的时间来测试/分析所有可能的方法来获取所有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 "^<" {} \+