PHP:scandir()太慢了

我必须做一个功能,列出所有子文件夹到一个文件夹中。 我有一个无文件过滤器,但该函数使用scandir()进行列表。 这使得应用程序非常慢。 有没有其他的scandir(),甚至不是原生的php函数? 提前致谢!


您可以使用可能更快的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;
}

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

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

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

链接地址: http://www.djcxy.com/p/51191.html

上一篇: PHP: scandir() is too slow

下一篇: Matplotlib does not display hatching when rendering to pdf