2014-02-12 3 views
0

Я пытаюсь найти лучший способ поиска в каталоге файлов с PHP и вернуть список файлов в течение периода даты. Имена файлов имеют отметки времени, но с помощью этого метода для получения результатов потребуется циклический переход по каждому файлу. В папке более 80 000 файлов. Это ресурс тяжелый.PHP показать файлы в каталоге в определенную дату/время

Есть ли встроенные функции для PHP для этого или что лучше для этого?

Благодаря

EDIT: Будет ли это более эффективно вызвать обратный конец сценария, как Perl, а затем возвращать результаты в PHP.

ответ

1

Попробуйте это:

function getFilesByTime($folder, $from, $to, $format){ 
    $contents = scandir($folder); $a = array(); 
    foreach($contents as $f){ 
    if(is_file($f)){ 
     $ft = filemtime($f); 
     if($ft >= strtotime($from) && $ft <= strtotime($to))$a[$f] = date($format, $ft); 
    } 
    } 
    return $a; 
} 
print_r(getFilesByTime('wherever', '10/15/2005', 'now', 'F d, Y H:i:s')); 
+0

Спасибо за ваш комментарий, я хотел не загружать полный список файлов, я надеялся, что это может быть как можно меньше. Я полагаю, что нет способа использовать индекс файловой системы с PHP? –

1

Это довольно легко сделать, не потребляя много оперативной памяти (если по какой-то причине вам не нужно читать во всех файлах). Я много раз делал это программное обеспечение, и он работает хорошо.

Используйте opendir, чтобы открыть каталог, который хотите изучить.

Затем используйте readdir в цикле, чтобы читать имена файлов по одному. readdir обрабатывает файлы в том же порядке, в котором они хранятся в объекте каталога файловой системы. Это полезно для каталога такого размера, как тот, который вы упомянули, потому что он не будет пытаться сортировать имена файлов. (Там другая апи называется scandir Это один делает то, что имена файлов;. Не использовать его в вашем приложении много-файлов.)

Каждый раз, когда вы звоните readdir это дает вам имя следующего файла в каталоге , Вот документация; примеры полезны. http://www.php.net/manual/en/function.readdir.php

После того, как у вас есть имя каждого файла, вы можете эффективно искать различные атрибуты файла с помощью stat. http://www.php.net/manual/en/function.stat.php Это расскажет вам полезные вещи, такие как время создания, длина, владелец.

Если вы на системе * NIX (как BSD или Linux), вы можете очень быстро переместить файл в другой каталог на одной и той же файловой системе без его копирования, с помощью link, а затем unlink. Если вы только unlink, это удалит его.

Одна вещь, чтобы иметь в виду здесь: вы должны относиться порядок, в котором readdir дает вам обратно ваши имена файлов формально непредсказуемы или случайного. Они не гарантированы в любом порядке. Я был пойман этим, потому что удаленные (NFS) файловые системы обрабатывали порядок по-другому, чем локальные файловые системы, в нескольких средах, которые я использовал.

+0

Спасибо за ваш ответ. Будет ли более эффективным вызов сценария конца, такого как perl, а затем вернуть результаты в PHP? –

+0

@JohnJ, нет, PERL будет иметь такую ​​же эффективность; вы сделаете все это так же в PERL как PHP. В любом случае это займет время пропорционально количеству файлов и постоянному объему памяти. –

+0

Хорошо спасибо за вашу помощь :) –

Смежные вопросы