PHP: scandir() is too slow

后端 未结 2 545
礼貌的吻别
礼貌的吻别 2020-12-05 21:41

I have to make a function that lists all subfolders into a folder. I have a no-file filter, but the function uses scandir() for listing. That makes the application very slow

相关标签:
2条回答
  • You can use readdir which may be faster, something like this:

    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;
    }
    

    May require some tweeking but this is essentially what scandir does, and it should be faster, if not please write an update as i would like to see if i can make a faster solution.

    Another issue is if your reading a very large directory your filling an array up within the internal memory and that may be where your memory is going.

    You could try and create a function that reads in offsets so that you can return 50 files at a time!

    reading chunks of files at a time would be just as simple to use, would be like so:

    $offset = 0;
    while(false !== ($Batch = ReadFilesByOffset("/tmp",$offset)))
    {
        //Use $batch here which contains 50 or less files!
    
        //Increment the offset:
        $offset += 50;
    }
    
    0 讨论(0)
  • 2020-12-05 21:59

    Don't write your own. PHP has a Recursive Directory Iterator built specifically for this:

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

    As a rule of thumb (aka not 100% of the time), since it's implemented in straight C, anything you build in PHP is going to be slower.

    0 讨论(0)
提交回复
热议问题