大きなディレクトリで xml ファイルを再帰的に検索し、特定のタグ '< run >' が含まれているかどうかをテストする必要があります。現時点では、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 "^<" {} \+