Более быстрый способ сопоставления имени файла в папке, содержащей тысячи файлов - PullRequest
2 голосов
/ 06 августа 2011

Я использовал этот readdir, чтобы найти файл в папке

$handler = opendir($folder);

while ($file = readdir($handler)) {

  if ($file != "." && $file != ".." && substr($file,0,7) == '98888000') {
    print $file. "<br />";
  }

}

но поскольку у меня есть тонны файлов в папке, для выполнения запроса требуется несколько минут: как я могу ускорить его?
Считайте, что я на PHP5 + IIS.

Я пробовал даже glob ()

foreach (glob($folder.98888000."*.pdf") as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}

но ничего не вернулось.

Ответы [ 2 ]

2 голосов
/ 06 августа 2011

А как же glob может быть? Находит файлы, соответствующие шаблону:

glob('98888000*')

может работать.

Если вам нужны opendir и readdir, то вы можете взглянуть на fnmatch.

0 голосов
/ 06 августа 2011

Сначала проверьте, содержит ли $folder / в конце или нет, это могло вызвать вашу проблему с glob (шаблон был просто неправильным).Так что добавляйте вещи по мере необходимости и убирайте те вещи, которые не нужны, чтобы написать шаблон с проппером:

$folder = realpath($folder);
foreach (glob($folder.'/98888000*', GLOB_NOSORT) as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}

Я использовал GLOB_NOSORT по соображениям скорости.

Вместо этогоиз использования glob() вы можете использовать GlobIterator класс :

$folder = realpath($folder);
$query = $folder.'/98888000*';
foreach(new GlobIterator($query) as $file)
{
    $name = $file->getFilename();
    $size = $file->getSize();
    echo "$name size $size \n";
}

Связанный: Перебирать определенные файлы в каталоге и 9 способов перебора каталога в PHP .

...