3

大量のファイルを含むディレクトリからいくつかのファイルを除外する必要があります。私のスクリプトでは、この関数が何度も呼び出されます。

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 中にのみファイルシステムにアクセスしますか?)

4

2 に答える 2

1

DirectoryIterator を静的変数に入れることで、php がファイルシステムに一度だけアクセスしてファイルを取得できるようになりますか? (= php は、DirectoryIterator の __construct 中にのみファイルシステムにアクセスしますか?)

はい。

しかし、サブクラス化するのではなく、コントローラーでデータ モデルの新しいインスタンスを作成したのはなぜでしょうか?

于 2012-05-17T13:04:32.307 に答える
1

ソースコードを調べたところ、イテレータを巻き戻すと、ディレクトリエントリを読み取ったストリームを巻き戻そうとしているようです。これ以上調べるために php の stream.c ファイルを掘り下げる勇気はありませんが、私が見たストリームのシークに基づいて、ファイルシステムに再びヒットすることはないと思います。

strace を使えばすぐにテストできると思います。

于 2012-05-19T21:56:46.740 に答える