Автоматическое удаление всех файлов через x раз - PullRequest
8 голосов
/ 17 декабря 2009

Как автоматически удалить все файлы в подкаталоге через x раз (скажем, через 24 часа) - без использования команды cronjob с сервера или pl. Как вы можете сделать это, просто используя PHP-код или просто посещая страницу, не нажимая что-либо, и команда auto запускается.

Ответы [ 7 ]

15 голосов
/ 21 декабря 2009

Ответ за последний комментарий из моего первого ответа. Я собираюсь написать пример кода, поэтому я создал другой ответ вместо добавления еще одного комментария.

Чтобы удалить файлы с пользовательским расширением, вы должны реализовать код:

<?php
  $path = dirname(__FILE__).'/files';
  if ($handle = opendir($path)) {

    while (false !== ($file = readdir($handle))) {
        if ((time()-filectime($path.'/'.$file)) < 86400) {  // 86400 = 60*60*24
          if (preg_match('/\.txt$/i', $file)) {
            unlink($path.'/'.$file);
          }
        }
    }
  }
?>

Комментарий : 1. В этом примере используется регулярное выражение /\.txt$/i, что означает, что будут удалены только файлы с расширением txt. Знак «$» означает, что имя файла должно заканчиваться строкой «.txt». Флаг 'i' указывает, что сравнение будет без учета регистра. Подробнее о функции preg_match () .

Кроме того, вы можете использовать функцию strripos () для поиска файлов с определенным расширением. Вот фрагмент кода:

<?php
  $path = dirname(__FILE__).'/files';
  if ($handle = opendir($path)) {

    while (false !== ($file = readdir($handle))) {
        if ((time()-filectime($path.'/'.$file)) < 86400) {  // 86400 = 60*60*24
          if (strripos($file, '.txt') !== false) {
            unlink($path.'/'.$file);
          }
        }
    }
  }
?>

Комментарий : Этот пример кажется более очевидным. Результат strripos() также может быть достигнут с помощью сочетания двух функций: strrpos(strtolower($file), '.txt'), но, IMHO, это хорошее правило - использовать меньше кода в вашем коде, чтобы сделать его более читабельным и меньшим. Пожалуйста, внимательно прочитайте предупреждение на странице функции strripos () (блок возвращаемых значений).

Еще одно важное замечание : если вы используете систему UNIX, удаление файла может завершиться ошибкой из-за прав доступа к файлу. Вы можете проверить руководство о функции chmod () .

Удачи.

8 голосов
/ 17 декабря 2009

Вы можете использовать основные функции PHP filectime () и unlink () , чтобы проверить время создания файла и удалить его / файлы.

EDIT. Пример кода:

  if ($handle = opendir('/path/to/files')) {

    while (false !== ($file = readdir($handle))) {
        if (filectime($file)< (time()-86400)) {  // 86400 = 60*60*24
          unlink($file);
        }
    }
  }
2 голосов
/ 15 августа 2016

Хорошо, мы идем, PHP-скрипт, который удаляет файлы, которым X число дней.

<?
$days = 1;
$dir = dirname ( __FILE__ );

$nofiles = 0;

    if ($handle = opendir($dir)) {
    while (( $file = readdir($handle)) !== false ) {
        if ( $file == '.' || $file == '..' || is_dir($dir.'/'.$file) ) {
            continue;
        }

        if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) {
            $nofiles++;
            unlink($dir.'/'.$file);
        }
    }
    closedir($handle);
    echo "Total files deleted: $nofiles \n";
}
?>

Теперь вставьте этот код и сохраните его как файл php, загрузите его в папку, из которой вы хотите удалить файлы. Вы можете увидеть в начале этого php-кода

$days = 1;

, которое устанавливает количество дней, например, если вы установите значение 2, файлы старше 2 дней будут удалены. По сути, это то, что происходит, когда вы запускаете скрипт, получаете текущий каталог и читаете записи файла, пропускаете «.» Текущего каталога и дополнительно проверяете, есть ли другие каталоги,

if ( $file == '.' || $file == '..' || is_dir($dir.'/'.$file) ) {
           continue;
}

если запись файла не является каталогом, она выбирает время изменения файла (время последнего изменения) и сравнивает, если это число дней

if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) {
            $nofiles++;
            unlink($dir.'/'.$file);
}

если условие становится истинным, то он удаляет файл с помощью функции php unlink (). Наконец закрывает каталог и выходит. Я также добавил счетчик для подсчета количества удаляемых файлов, который будет отображаться в конце процесса удаления. Поэтому поместите php-файл в каталог, который необходимо удалить, и запустите его.

Надеюсь, это поможет:)

1 голос
/ 02 января 2017

После попытки использовать эти примеры я столкнулся с несколькими проблемами:

  1. Оператор сравнения должен быть больше, не меньше, чем
  2. filemtime возвращает измененное время. filectime - время изменения данных inode файла; то есть, когда права доступа, владелец, группа или другие метаданные из inode обновляются, что может привести к неожиданным результатам

Я изменил пример для использования filemtime и исправил сравнение следующим образом:

<?php
  $path = dirname(__FILE__).'/files';
  if ($handle = opendir($path)) {

    while (false !== ($file = readdir($handle))) {
        if ((time()-filemtime($path.'/'.$file)) > 86400) {  // 86400 = 60*60*24
          if (preg_match('/\.txt$/i', $file)) {
            unlink($path.'/'.$file);
          }
        }
    }
  }
?>
1 голос
/ 16 декабря 2015

Вот еще один пример, который использует GLOB и удалит любой файл

$files = glob('path/to/your/files/*');

foreach($files as $file) { // iterate files
    // if file creation time is more than 5 minutes
    if ((time() - filectime($file)) > 3600) {  // 86400 = 60*60*24
        unlink($file);
    }
}

или если вы хотите исключить определенные файлы

$files = preg_grep('#\.txt#', glob('/path/to/your/files/*'), PREG_GREP_INVERT);
0 голосов
/ 12 октября 2016
function deleteCachedData($hours=24)
{
    $files = glob(ROOTDIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.'*.txt');
    foreach($files as $file) {
        if(is_file($file) && (time() - filectime($file)) > $hours*3600) {
            unlink($file);
        }
    }

}

0 голосов
/ 13 октября 2012

Я использую командную оболочку AT, это все равно что cronjob, хотя

PHP:

exec("echo rm /somedir/somefile.ext|at now +24 hours");
...