PHP: самый быстрый способ проверить, является ли каталог пустым? - PullRequest
0 голосов
/ 05 июня 2018

В переполнении стека есть несколько ответов на вопрос, как проверить, пуст ли каталог, но какой из них самый быстрый, какой способ наиболее эффективен?


Ответ 1: https://stackoverflow.com/a/7497848/4437206

function dir_is_empty($dir) {
  $handle = opendir($handle);
  while (false !== ($entry = readdir($handle))) {
    if ($entry != "." && $entry != "..") {
      closedir($handle); // <= I added this
      return FALSE;
    }
  }

  closedir($handle); // <= I added this
  return TRUE;
}

Ответ 2: https://stackoverflow.com/a/18856880/4437206

$isDirEmpty = !(new \FilesystemIterator($dir))->valid();

Ответ 3: https://stackoverflow.com/a/19243116/4437206

$dir = 'directory'; // dir path assign here
echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty';

Или, есть совершенно другой способ, который быстрее и эффективнее, чем эти три выше?

Что касаетсяОтвет 1, обратите внимание, что я добавил closedir($handle);, но я не уверен, что это необходимо (?).

РЕДАКТИРОВАТЬ: Первоначально я добавил closedir($dir); вместо closedir($handle);, но я исправил это как @ duskwuff , указанный в его ответе .

1 Ответ

0 голосов
/ 05 июня 2018

Подходы opendir() / readdir() и FilesystemIterator концептуально эквивалентны и выполняют идентичные системные вызовы (как проверено на PHP 7.2, работающем под Linux).Нет фундаментальной причины, по которой одно из них будет быстрее другого, поэтому я бы порекомендовал вам запускать тесты, если вам нужна микрооптимизация.

Подход с использованием glob() будет работать хуже.glob() возвращает массив всех имен файлов в каталоге;Построение этого массива может занять некоторое время.Если в каталоге много файлов, он будет работать на намного хуже, поскольку должен выполнять итерацию по всему содержимому каталога.

Использование glob() также даст неверные результаты вчисло ситуаций:

  • Если $dir - это имя каталога, содержащее определенные специальные символы, включая *, ? и [ / ]
  • Если $dir содержит только точечные файлы (т. Е. Имена файлов начинаются с .)

Что касается ответа 1, обратите внимание, что я добавил closedir($dir);, но я не уверенесли это необходимо (?).

Это хорошая идея, но вы неправильно ее реализовали.Дескриптор каталога, который должен быть закрыт: $handle, а не $dir.

...