Как удалить файлы из каталога на основе даты создания в php? - PullRequest
27 голосов
/ 05 февраля 2010

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

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

Ответы [ 7 ]

44 голосов
/ 05 февраля 2010

Я думаю, что вы могли бы пойти по этому пути, просматривая каталог с помощью 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 возвращает время последней модификации файла вместо даты создания.

10 голосов
/ 04 июня 2011

должно быть

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

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

5 голосов
/ 05 февраля 2010

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

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 );
  }
}
3 голосов
/ 05 февраля 2010

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

1 голос
/ 16 июня 2017
/* 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);
    }
}

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

0 голосов
/ 05 июня 2014

только для того, чтобы отметить сравнение времени Гордона (см. Выше: 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 по умолчанию отличается от системного часового пояса.

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

0 голосов
/ 26 мая 2012

Изменяя решение @ 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...