Php 获取迭代器中项数的最快方法是什么?
我有一个文件夹结构,里面有超过300000个文件和文件夹 当我迭代此结构以获取特定类型的所有文件时,这需要大约半秒钟的时间来完成:Php 获取迭代器中项数的最快方法是什么?,php,iterator,Php,Iterator,我有一个文件夹结构,里面有超过300000个文件和文件夹 当我迭代此结构以获取特定类型的所有文件时,这需要大约半秒钟的时间来完成: $path = "/path/to/folder"; $folder = new RecursiveDirectoryIterator($path); $iterator = new RecursiveIteratorIterator($folder); $files = new RegexIterator($iterator, '/^.+\.jpg$/i',
$path = "/path/to/folder";
$folder = new RecursiveDirectoryIterator($path);
$iterator = new RecursiveIteratorIterator($folder);
$files = new RegexIterator($iterator, '/^.+\.jpg$/i', RecursiveRegexIterator::GET_MATCH);
但是获得结果迭代器($files)的长度大约需要10秒:
是否有更快的方法获取迭代器中的项数?可能在迭代期间?
这些都需要大约10秒钟: 1.find(命令行) 2.scandir(PHP,)
注:
我在数我脑子里的秒数。因此,两种方法之间可能会有一些细微的差别,但它并没有大到与我相关。您是否尝试过使用带有
scandir
/preg\u match
的普通递归函数来做同样的事情,以及它有多快/慢?@CharlotteDunois是的,我尝试过(参见我的编辑),而且在执行时间上没有明显的差异。$files=new RegexIterator
不会遍历这些文件。它只是创建一个准备工作的指针。真正的迭代发生在您调用迭代器\u count
或在循环中使用该迭代器时。半秒钟是准备结构和指针的时间。
$n = iterator_count($files);
find /path/to/folder -type f | wc -l
$intFileCount = countFilesInDirectory($path, array('jpg'));
echo $intFileCount;
function countFilesInDirectory($strPathToDirectory, $arrExtensions) {
$intFileCount = 0;
$arrFiles = scandir($strPathToDirectory);
foreach($arrFiles as $strFile) {
if('.' != $strFile && '..' != $strFile) {
if(is_dir("$strPathToDirectory/$strFile") && is_readable("$strPathToDirectory/$strFile")) {
$intFileCount += countFilesInDirectory("$strPathToDirectory/$strFile", $arrExtensions);
} else {
$arrFileInfo = pathinfo($strFile);
if(in_array($arrFileInfo['extension'], $arrExtensions)) {
$intFileCount += 1;
}
}
}
}
return $intFileCount;
}