PHP File Manager падает при чтении большого каталога

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

На моем сайте есть большой каталог изображений (25 ГБ), который очень хорошо организован. Я использую tinyMCE с файловым менеджером Roxy Fileman. Когда я пытаюсь загрузить корневую папку «images», она просто продолжает загружаться и в итоге вылетает. Если я жестко запрограммировал его, чтобы открыть «картинки / посты», он нормально загружается. Я проверил исходный код, и похоже, что эта функция выполняет чтение каталогов.

function listDirectory($path){
$ret = @scandir($path);
if($ret === false){
$ret = array();
$d = opendir($path);
if($d){
while(($f = readdir($d)) !== false){
$ret[] = $f;
}
closedir($d);
}
}

return $ret;
}

В частности, один каталог содержит около 99% изображений, и мне не нужно обращаться к нему с помощью файлового менеджера, но я также не могу переместить каталог. «изображения / игры» является причиной. Есть ли способ для меня, чтобы игнорировать этот каталог или только сканирование до определенной глубины.

0

Решение

Если есть способ читать каталоги самостоятельно, вы можете сделать это и создать список с игнорируемыми каталогами. Вы сказали, что каталог games содержит около 99% изображений, но вам не нужно было получить к нему доступ. Это может быть идеальным кандидатом для игнорируемого каталога.

Если это возможно, я бы написал что-то вроде следующего:

function read_directory_files($path, array $ignored = []) {

/*
* Check if the provided path is readable and is a directory.
*/
if(!is_readable($path) || is_file($path)) {
throw new \LogicException('The provided path must be a readable directory.');
}

$files.      = [];
$directories = scandir($path);

/*
* Remove current (.) and parent (..) directory references.
*/
unset($directories[0], $directories[1]);

/*
* Check if the directory is empty after the current and parent
* directory references has been removed.
*/
if(empty($directories)) {
return null;
}

foreach($directories as $directory) {

if(!is_file($directory) && in_array($directory, $ignored)) {
continue;
}

if(!is_file($directory)) {

$key         = basename($directory);
$files[$key] = read_directory_files($directory);

}else{

$files[] = $directory;

}

}

return $files;

}

Этот код не проверен поэтому может произойти ошибка, но это должно позволить вам выбрать, из каких каталогов вы хотите читать файлы. Использование будет:

$ignored = [
'games'
];

$files = read_directory_files('path/to/images', $ignored);

Если вы не можете использовать свой собственный механизм для чтения каталогов, вы можете попробовать заменить существующий код чем-то вроде того, что я написал, но сделайте это на свой страх и риск и не забудьте сделать резервную копию своего кода.

Надеюсь, что это может быть полезным, счастливого кодирования!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]