【问题标题】:How to efficiently use DirectoryIterator?如何有效地使用 DirectoryIterator?
【发布时间】:2012-05-25 00:19:32
【问题描述】:

我需要从包含大量文件的目录中过滤掉一些文件。在我的脚本中,这个函数被调用了很多次。

function getFilteredFiles($criteria) {
    static $files = '';           
    if ($files == '') {
        $files = new DirectoryIterator($path);
    }
    else {
        $files->rewind();
    }

    foreach($files as $file) {
         if (! $file->isDot()) {
             if (!$file->isDir()) {
                  //using $criteria
                  ...
              }
         }
    }
    ...
 }

将 DirectoryIterator 放在静态变量中是让 php 只访问文件系统一次以获取文件的方式吗? (= php 是否只在 DirectoryIterator 的 __construct 期间进入文件系统?)

【问题讨论】:

    标签: php performance spl


    【解决方案1】:

    我查看了源代码,看起来当您倒回迭代器时,他们试图倒回他们从中读取目录条目的流。我不敢深入研究 php streams.c 文件以进一步查看,但根据我看到的流搜索,我猜它不会再次访问文件系统。

    我猜你可以使用 strace 快速测试。

    【讨论】:

      【解决方案2】:

      将 DirectoryIterator 放在静态变量中的方式 让php只去文件系统一次来获取文件? (= 做 php 仅在 __construct 期间访问文件系统 目录迭代器?)

      是的。

      但是你为什么要在控制器中创建数据模型的新实例而不是对其进行子类化呢?

      【讨论】: