2012-05-17 1 views
3

Мне нужно отфильтровать некоторые файлы из каталога, содержащего множество файлов. Во время моего скрипта эта функция вызывается много раз.Как эффективно использовать DirectoryIterator?

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 только перейти в файловую систему во время __construct в DirectoryIterator?)

ответ

1

Я посмотрел исходный код и, похоже, они пытаются перемотать поток, с которого они считывают записи каталога, когда вы перематываете итератор. Я не смею копаться в файле php streams.c, чтобы смотреть дальше, но на основе поиска потока, которое я видел, я бы предположил, что он больше не попадает в файловую систему.

Я думаю, вы можете быстро протестировать, используя strace.

1

ставит DirectoryIterator в статической переменной в путь, чтобы позволить PHP только перейти в файловую систему один раз, чтобы получить файлы? (= Это PHP только перейти в файловую систему во время __construct в DirectoryIterator?)

Да.

Но почему вы создали новый экземпляр модели данных в контроллере вместо подкласса?