самый быстрый способ найти каталоги, содержащие определенный элемент - PullRequest
2 голосов
/ 13 января 2012

У меня есть приложение PHP 5.3.4, работающее в Windows XP SP3, где мне нужно проиндексировать содержимое каталога на удаленном ПК. Самый большой каталог, который я индексирую, содержит около 18 000 элементов

Этот вызов найдет такие элементы, как \\somepc.mycorp.com\foo\mydir\bar\zoo.zip.

// look in all the directories in \\somepc.mycorp.com\foo for directories containing a file \bar\zoo.zip
$item_list = GetFileList('\\\\somepc.mycorp.com\\foo', '\\bar\\zoo.zip');

Реализуется как:

function GetFileList($base_dir, $path_mask)
{
    $result= array();
    if ($handle = opendir($base_dir)) 
    {
        while (false !== ($entry = readdir($handle))) 
        {
            // only add items that match the mask we're looking for
            if ($entry != "." &&
                $entry != ".." && 
                file_exists($base_dir.'\\$entry\\$path_mask'))
            {
                array_push($result, $entry);
            }
        }

        closedir($handle);
    }
    return $result;
}

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

Есть ли более быстрый способ сделать это?

1 Ответ

3 голосов
/ 13 января 2012

Я не хочу тянуть эту карту, но то, что вы делаете, может быть выполнено намного быстрее с использованием сценариев bash или даже windows - PHP, вероятно, не является подходящим инструментом для работы здесь.Системный вызов (даже из PHP) к dir /s /b или find даст вам список всех существующих файлов, а затем вы сможете выполнять итерации по этим строкам с помощью PHP гораздо быстрее, чем проверять, существует ли файл вкаждый каталог.

Я бы сделал это в bash следующим образом (потому что я ленив и не знаю правильный синтаксис поиска):

find | grep '/bar/zoo.zip'

Я не знаю подходящегоКоманда оболочки Windows (потому что на моем компьютере установлен WinGnu32 grep), поэтому я не могу вам помочь.

Редактировать:

Я немного обдумал и нашел эквивалент Windowsвышеуказанной команды:

dir /s /b | find "/bar/zoo.zip"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...