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

PHP: The fastest way to check if the directory is empty?

关于如何检查目录是否为空的问题,在Stack Overflow上有几种答案,但哪种最快,哪种方式最有效?


答案一:

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;
}

答案二:

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

答案3:

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

或者,还有完全不同的方式比上面这三种方式更快更有效吗?

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

编辑: 最初我添加了 closedir($dir); 而不是 closedir($handle);,但我将其更正为 @duskwuff stated in his .

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

使用glob() 的方法性能会更差。 glob() returns 目录中所有文件名的数组;构建该数组可能需要一些时间。如果目录中有很多文件,它会执行 更糟,因为它必须遍历目录的全部内容。

在许多情况下,使用 glob() 也会给出不正确的结果:

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

As for the Answer 1, please note that I added closedir($dir);, but I'm not sure if that's necessary (?).

这是个好主意,但您实施不当。需要关闭的目录句柄是$handle,不是$dir.