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

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

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

28
задан Gordon 23 January 2012 в 00:05
поделиться

3 ответа

Я думаю, вы могли бы сделать это, проходя по каталогу с помощью 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); 
}
?>

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

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

46
ответ дан 28 November 2019 в 02:52
поделиться

Попробуйте 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.

3
ответ дан 28 November 2019 в 02:52
поделиться

Приведенная ниже функция выводит список файлов на основе даты их создания:

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 );
  }
}
5
ответ дан 28 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: