首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP: scandir()太慢

PHP: scandir()太慢
EN

Stack Overflow用户
提问于 2011-03-03 04:07:05
回答 2查看 14.1K关注 0票数 10

我必须创建一个函数,将所有子文件夹列出到一个文件夹中。我有一个无文件过滤器,但是函数使用scandir()来列出。这使得应用程序变得非常慢。有没有scandir()的替代方法,甚至是非原生的php函数?提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-03 04:56:05

您可以使用可能更快的readdir,如下所示:

代码语言:javascript
复制
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;
}

可能需要一些to,但这基本上是scandir所做的,它应该更快,如果不是,请写一个更新,因为我想看看我是否可以做一个更快的解决方案。

另一个问题是,如果你读取一个非常大的目录,你会在内存中填满一个数组,这可能就是你的内存要去的地方。

您可以尝试创建一个读取偏移量的函数,以便一次可以返回50个文件!

一次读取文件块同样易于使用,如下所示:

代码语言:javascript
复制
$offset = 0;
while(false !== ($Batch = ReadFilesByOffset("/tmp",$offset)))
{
    //Use $batch here which contains 50 or less files!

    //Increment the offset:
    $offset += 50;
}
票数 3
EN

Stack Overflow用户

发布于 2011-03-03 05:03:38

不要写你自己的。PHP有一个专门为此构建的递归目录迭代器:

http://php.net/manual/en/class.recursivedirectoryiterator.php

作为一个经验法则(也不是100% ),因为它是直接用C实现的,所以你用PHP构建的任何东西都会变慢。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5172784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档