Как удалить файлы из каталога на основе даты создания в php?

У меня есть папка с кешем, в которой хранятся файлы html. Они перезаписываются, когда это необходимо, но в то же время в них кэшируются также редко используемые страницы, которые в конечном итоге используют пространство (через 5 недель диск был заполнен более 2,7 миллионами кеш-файлов).

Каков наилучший способ петли через каталог, содержащий несколько сотен тысяч файлов, и удалять файлы старше 1 дня?

Я думаю, вы могли бы это сделать, перейдя через каталог с readdir и удалив на основе метки времени:

 <?php $path = '/path/to/files/'; if ($handle = opendir($path)) { while (false !== ($file = readdir($handle))) { $filelastmodified = filemtime($path . $file); //24 hours in a day * 3600 seconds per hour if((time() - $filelastmodified) > 24*3600) { unlink($path . $file); } } closedir($handle); } ?> 

Значение if((time() - $filelastmodified) > 24*3600) будет выбирать файлы старше 24 часов (24 часа раз 3600 секунд в час). Если вам нужны дни, он должен читать, например, 7 * 24 * 3600 для файлов старше недели.

Также обратите внимание, что filemtime возвращает время последней модификации файла, а не дату создания.

Должен быть

 if((time()-$filelastmodified) > 24*3600 && is_file($file)) 

чтобы избежать ошибок для . и .. каталоги.

Следующая функция перечисляет файл в зависимости от даты создания:

 private function listdir_by_date( $dir ){ $h = opendir( $dir ); $_list = array(); while( $file = readdir( $h ) ){ if( $file != '.' and $file != '..' ){ $ctime = filectime( $dir . $file ); $_list[ $file ] = $ctime; } } closedir( $h ); krsort( $_list ); return $_list; } 

Пример:

 $_list = listdir_by_date($dir); 

Теперь вы можете прокручивать список, чтобы увидеть их даты и удалить соответственно:

 $now = time(); $days = 1; foreach( $_list as $file => $exp ){ if( $exp < $now-60*60*24*$days ){ unlink( $dir . $file ); } } 

Попробуйте SplIterators

 // setup timezone and get timestamp for yesterday date_default_timezone_set('Europe/Berlin'); // change to yours $yesterday = strtotime('-1 day', time()); // setup path to cache dir and initialize iterator $path = realpath('/path/to/files'); // change to yours $objects = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($path)); // iterate over files in directory and delete them foreach($objects as $name => $object){ if ($object->isFile() && ($object->getCTime() < $yesterday)) { // unlink($object); echo PHP_EOL, 'deleted ' . $object; } } 

Время создания доступно только в Windows.

 /* Detele Cache Files Here */ $dir = "cache/"; /** define the directory **/ /*** cycle through all files in the directory ***/ foreach (glob($dir."*") as $file) { //foreach (glob($dir.'*.*') as $file){ /*** if file is 24 hours (86400 seconds) old then delete it ***/ if (filemtime($file) < time() - 3600) { // 1 hour unlink($file); } } 

Я использую это, надеюсь, что это поможет.

просто отметить сравнение времени Гордона (см. выше: https://stackoverflow.com/a/2205833/1875965 ) является единственным правильным при сравнении с «днями», а не «24 часа», поскольку не все дни имеют 24 часа ( летнее время / зима и т. д.).

Например, используйте

 // setup timezone and get timestamp for yesterday date_default_timezone_set('Europe/Berlin'); // change as appropriate $yesterday = strtotime('-1 day', time()); 

при сравнении даты файла.

Это может не быть большой проблемой, но может привести к неожиданному поведению, когда вы работаете с неделями / месяцами и т. Д. Я счел, что лучше всего использовать вышеупомянутый метод, поскольку он будет делать любой процесс, связанный с датами / временем, согласованным и избегать спутанность сознания.

Также проверьте, что такое часовой пояс для дат файла, поскольку иногда по умолчанию для PHP отличается от системного часового пояса.

С наилучшими пожеланиями, Сандра.

Изменив решение @ pawel, я создал функцию ниже. Сначала я забыл добавить «путь» к имени файла, который забирает мой полчаса, чтобы узнать.

 public function deleteOldFiles ($hours=24) { $path='cache'.DS; if ( $handle = opendir( $path ) ) { while (false !== ($file = readdir($handle))) { $filelastmodified = filemtime($path.$file); if((time()-$filelastmodified) > 24*3600 && is_file($path.$file)) { unlink($path.$file); } } closedir($handle); } }