Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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 возвращает время последней модификации файла вместо даты создания.

Ответ 2

Это должно быть

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

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

Ответ 3

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

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 );
  }
}

Ответ 4

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

Ответ 5

/* 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);
    }
}

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

Ответ 6

просто отметить сравнение времени Гордона (см. выше: fooobar.com/questions/199880/...) является единственным правильным при сравнении с "днями", а не "24 часа", так как не все дни имеют 24 часа (летнее/зимнее время и т.д.).

например. использовать

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

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

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

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

С уважением, Сандра.

Ответ 7

Изменив решение @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);
    }
}