我必须创建一个将所有子文件夹列出到一个文件夹中的函数。我有一个无文件过滤器,但该函数使用 scandir() 进行列表。这使得应用程序非常缓慢。是否有 scandir() 的替代方法,甚至不是原生的 php 函数?提前致谢!
问问题
14229 次
2 回答
4
不要自己写。PHP 有一个专门为此构建的递归目录迭代器:
http://php.net/manual/en/class.recursivedirectoryiterator.php
根据经验(也不是 100% 的时间),因为它是用纯 C 实现的,所以你用 PHP 构建的任何东西都会变慢。
于 2011-03-02T21:03:38.133 回答
3
您可以使用可能更快的 readdir,如下所示:
function readDirectory($Directory,$Recursive = true)
{
if(is_dir($Directory) === false)
{
return false;
}
try
{
$Resource = opendir($Directory);
$Found = array();
while(false !== ($Item = readdir($Resource)))
{
if($Item == "." || $Item == "..")
{
continue;
}
if($Recursive === true && is_dir($Item))
{
$Found[] = readDirectory($Directory . $Item);
}else
{
$Found[] = $Directory . $Item;
}
}
}catch(Exception $e)
{
return false;
}
return $Found;
}
可能需要一些 tweeking 但这基本上是 scandir 所做的,它应该更快,如果不是,请写一个更新,因为我想看看我是否可以做出更快的解决方案。
另一个问题是,如果您阅读一个非常大的目录,您会在内部存储器中填充一个数组,这可能就是您的记忆所在。
您可以尝试创建一个读取偏移量的函数,以便一次返回 50 个文件!
一次读取大块文件将同样简单易用,就像这样:
$offset = 0;
while(false !== ($Batch = ReadFilesByOffset("/tmp",$offset)))
{
//Use $batch here which contains 50 or less files!
//Increment the offset:
$offset += 50;
}
于 2011-03-02T20:56:04.977 回答