Я использую рекурсивную функцию, чтобы возвращать список всех файлов изображений в определенном каталоге. Функция работает нормально до тех пор, пока не будет достигнут определенный размер возвращаемого массива (что я предполагаю, что это проблема). Есть ли что-то еще, что я могу сделать для решения проблемы, или альтернативный вариант, который может быть реализован здесь, без изменения кода, поскольку приложение работает вживую? Вот моя рекурсивная функция.
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 ГБ, но я не могу решить проблему.
scandir
возвращается .
и ..
(текущий и верхний каталог) в виде списка каталогов. и это может привести к тому, что ваш скрипт будет работать вечно с бесконечной рекурсивной.
Попробуйте заменить строку
}elseif(is_dir($path) && is_readable($path)) {
с
}elseif(is_dir($path) && is_readable($path) && $content!='.' && $content!='..' ) {
может исправить вашу проблему.
allowext
которые отфильтровывают их. Я не верю, что 1 ГБ (или даже 16 МБ) памяти недостаточно для сканирования 83 файлов: /