PHP:检查目录是否为空的最快方法?

时间:2018-06-04 22:38:34

标签: php php-7.2

在Stack Overflow上有几个答案可以解答如何检查目录是否为空,但哪个是最快的,哪种方式最有效?

回答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中所述的answer

1 个答案:

答案 0 :(得分:4)

opendir() / readdir()FilesystemIterator方法在概念上是等效的,并执行相同的系统调用(在Linux下运行的PHP 7.2上测试)。没有任何根本原因可以解释为什么其中一个会比另一个更快,所以如果你需要进行微优化,我建议你运行基准测试。

使用glob()的方法会更糟糕。 glob()返回目录中所有文件名的数组;构造该数组可能需要一些时间。如果目录中有许多文件,它将执行更多更糟糕的情况,因为它必须遍历目录的整个内容。

在许多情况下,使用glob()也会得出错误的结果:

  • 如果$dir是包含某些特殊字符的目录名称,包括*?[ / ]
  • 如果$dir仅包含dotfiles(即文件名以.开头)
  

关于答案1,请注意我添加了closedir($dir);,但我不确定是否有必要(?)。

这是一个好主意,但您已经错误地实施了它。需要关闭的目录句柄是$handle,而不是$dir