在包含数千个文件的文件夹中匹配文件名的更快方法

3
我正在使用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";
}

但是它什么都没有返回。


甚至遍历数十万个文件也不应该需要几分钟时间!你确定没有更大的问题,比如磁盘 inode 耗尽了吗? - Pedro Silva
2个回答

2

或许可以考虑使用glob函数?它可以根据模式匹配文件:

glob('98888000*')

可能有效。

如果您需要使用opendirreaddir,那么您可能需要查看fnmatch


在发布之前,我查看了glob。我正在使用尝试的解决方案更新我的代码。 - pasine
重点是glob将使用操作系统自己的匹配工具(或至少是PHP本地实现的工具),因此比对每个文件名进行子字符串处理要快得多。 - Joey

1

首先检查$folder的结尾是否包含/,这可能导致您在使用glob时出现问题(模式不正确)。因此,根据需要添加内容并删除不必要的内容以编写正确的glob模式:

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

出于速度原因,我使用了GLOB_NOSORT

你可以使用GlobIterator类来代替使用glob()

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

相关:在目录中迭代特定文件PHP中迭代目录的9种方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接