У меня есть папка с кешем, в которой хранятся файлы 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); } }