Меня привлекли к работе над существующим веб-приложением CMS и File Management, которое предоставляет продавцу интерфейс управления для их онлайн-магазинов. Приложение для управления разработано на PHP.
Когда пользователи веб-сайтов просматривают интернет-магазины, ресурсы страницы (в основном изображения в путях вложенных папок) ссылаются непосредственно из HTML веб-магазинов и обслуживаются непосредственно с веб-сервера, который является отдельным от системы CMS.
Но для того, чтобы просматривать / искать / разрешать навигацию по файлам (то есть часть «Управление файлами»), приложение CMS должно иметь возможность доступа к структуре каталогов файлов / папок.
Поэтому мы используем монтирование Linux NFS к серверу файлов документов с сервера CMS. Это работает довольно хорошо, если количество файлов в дереве каталогов любого конкретного продавца не слишком велико (<10000). Тем не менее, некоторые продавцы имеют более 100000 файлов во вложенном дереве каталогов. Прогулка по дереву такого размера, чтобы получить только структуру каталогов, может занять более 120 секунд.
Извлечение только списка файлов в любом каталоге довольно быстро, но проблема возникает, когда мы пытаемся определить, какие из этих «файлов» на самом деле являются записями каталога, поэтому мы можем выполнить поиск по дереву.
Похоже, что функции PHP для проверки типа файла (либо вызов «is_dir» для каждого пути к файлу, извлеченного с помощью «readdir» или «scandir», либо использование «glob» с флагом GLOB_ONLYDIR) работают с каждым файлом индивидуально, а не навалом. Таким образом, сейчас отправляются тысячи и тысячи команд NFS. Из моих исследований до сих пор кажется, что это ограничение NFS, а не PHP.
Урезанный класс, показывающий только функцию, о которой идет речь:
class clImagesDocuments {
public $dirArr;
function getDirsRecursive( $dir ) {
if ( !is_dir( $dir )) {
return false;
}
if ( !isset( $this->dirArr )) {
$this->dirArr = glob( $dir . "/*", GLOB_ONLYDIR );
} else {
$this->dirArr = array_merge( $this->dirArr, glob( $dir . "/*", GLOB_ONLYDIR ) );
return false;
}
for( $i = 0; $i < sizeof( $this->dirArr ); $i ++) {
$this->getDirsRecursive( $this->dirArr [$i] );
}
for( $i = 0; $i < sizeof( $this->dirArr ); $i ++) {
$indexArr = explode( $dir, $this->dirArr [$i] );
$tempDir[$indexArr[1]] = $this->dirArr [$i];
}
$this->dirArr = $tempDir;
}
}
Выполнение того же PHP-кода для локального извлечения дерева каталогов и т. Д. На сервере файловых документов выполняется намного, намного быстрее (на 2 или 3 порядка), возможно потому, что локальная файловая система кэширует структуру каталогов. Я вынужден думать, что моя проблема связана с NFS.
Я планирую написать простое веб-приложение, которое будет работать на веб-сервере файлов документов и обеспечивать поиск структуры каталогов в реальном времени через API.
Буду признателен за любые мысли или предложения.
Альтернативное решение — вы можете поставить перед всеми каталогами некоторую строку, а когда вы получите список с файлами, вы можете проверить, какие из них на самом деле являются каталогами, проверив, содержат ли они строку. Вы можете полностью избежать is_dir()
сюда.
Других решений пока нет …