Размер массива ограничен в PHP scandir ()

0

Я использую рекурсивную функцию, чтобы возвращать список всех файлов изображений в определенном каталоге. Функция работает нормально до тех пор, пока не будет достигнут определенный размер возвращаемого массива (что я предполагаю, что это проблема). Есть ли что-то еще, что я могу сделать для решения проблемы, или альтернативный вариант, который может быть реализован здесь, без изменения кода, поскольку приложение работает вживую? Вот моя рекурсивная функция.

function scanDirectories($rootDir, $allowext, $allData=array()) {
        $dirContent = scandir($rootDir);
            foreach($dirContent as $key => $content) {
                $path = $rootDir.'/'.$content;
                $ext = substr($content, strrpos($content, '.') + 1);

                if(in_array($ext, $allowext)) {
                    if(is_file($path) && is_readable($path)) {
                        $allData[] = $path;
                    }elseif(is_dir($path) && is_readable($path)) {
                        // recursive callback to open new directory
                        $allData = scanDirectories($path, $allData);
                    }
                }
            }
            return $allData;
        }

Например, у меня есть каталог с 83 файлами изображений, но я могу вернуть список из 28 из них. При поиске через Интернет я обнаружил, что это может быть результатом memory_limit который я могу увеличить с помощью ini_set('memory_limit', '1024M'); в моем сценарии, который делает ограничение памяти равным 1 ГБ, но я не могу решить проблему.

Теги:
arrays
recursion
out-of-memory

1 ответ

0

scandir возвращается . и .. (текущий и верхний каталог) в виде списка каталогов. и это может привести к тому, что ваш скрипт будет работать вечно с бесконечной рекурсивной.

Попробуйте заменить строку

}elseif(is_dir($path) && is_readable($path)) {

с

}elseif(is_dir($path) && is_readable($path) && $content!='.' && $content!='..' ) {

может исправить вашу проблему.

  • 0
    Я не думаю, что это похоже на то, как вы сказали, так как возвращенный массив содержит только необходимые файлы в списке, и нет верхнего или текущего каталога как такового. Но то, что он возвратил, намного меньше, чем то, что он должен был на самом деле вернуть.
  • 0
    Тогда речь идет о разрешении файлов или allowext которые отфильтровывают их. Я не верю, что 1 ГБ (или даже 16 МБ) памяти недостаточно для сканирования 83 файлов: /
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню