Правильный способ удаления всех файлов старше 2 дней в PHP

просто интересно

        $files = glob(cacheme_directory()."*");
        foreach($files as $file)
        {
            $filemtime=filemtime ($file);
            if (time()-$filemtime>= 172800)
            {
                unlink($file);
            }
        }

Я просто хочу убедиться, что код правильный или нет. Спасибо.

8 ответов


вы должны добавить is_file() проверьте, потому что PHP обычно перечисляет . и .., а также подкаталоги, которые могут находиться в каталоге, который вы проверяете.

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

<?php
  $files = glob(cacheme_directory()."*");
  $now   = time();

  foreach ($files as $file) {
    if (is_file($file)) {
      if ($now - filemtime($file) >= 60 * 60 * 24 * 2) { // 2 days
        unlink($file);
      }
    }
  }
?>

в качестве альтернативы вы также можете использовать DirectoryIterator, как показано в этот ответ. В этом простом случае на самом деле не предлагает никаких преимуществ, но это будет путь ООП.


самый простой способ-использовать DirectoryIterator:

<?php
if (file_exists($folderName)) {
    foreach (new DirectoryIterator($folderName) as $fileInfo) {
        if ($fileInfo->isDot()) {
        continue;
        }
        if ($fileInfo->isFile() && time() - $fileInfo->getCTime() >= 2*24*60*60) {
            unlink($fileInfo->getRealPath());
        }
    }
}
?>

другой более простой и современный способ, используя FilesystemIterator.

в качестве примера я использую каталог "logs".

$fileSystemIterator = new FilesystemIterator('logs');
$now = time();
foreach ($fileSystemIterator as $file) {
    if ($now - $file->getCTime() >= 60 * 60 * 24 * 2) // 2 days 
        unlink('logs/'.$file->getFilename());
}

главное преимущество: DirectoryIterator возвращает виртуальные каталоги "." и." .- в петле. Но FilesystemIterator игнорирует их.


выглядит правильным для меня. Я просто предлагаю вам заменить 172800 с 2*24*60*60 для ясности.


имейте в виду, что вы столкнетесь с проблемами, если у вас очень большое количество файлов в каталоге.

Если вы думаете, что это может повлиять на вас, попробуйте снизить подхода, такие как opendir.


вот пример того, как это сделать рекурсивно.

function remove_files_from_dir_older_than_x_seconds($dir,$seconds = 3600) {
    $files = glob(rtrim($dir, '/')."/*");
    $now   = time();
    foreach ($files as $file) {
        if (is_file($file)) {
            if ($now - filemtime($file) >= $seconds) {
                echo "removed $file<br>".PHP_EOL;
                unlink($file);
            }
        } else {
            remove_files_from_dir_older_than_x_seconds($file,$seconds);
        }
    }
}

remove_files_from_dir_older_than_x_seconds(dirname(__file__).'/cache/', (60 * 60 * 24 * 1) ); // 1 day

/* Delete 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() - 172800) { // 2 days
    unlink($file);
    }
}

надеюсь это поможет вам.


/** It deletes old files.
 *  @param string $dir Directory
 *  @param int $secs Files older than $secs seconds
 *  @param string $pattern Files matching $pattern
 */
function delete_oldfiles($dir,$secs,$pattern = "/*")
{
    $now = time();
    foreach(glob("$dir$pattern") as $f) {
      if (is_file($f) && ($now - filemtime($f) > $secs)) unlink($f);
    }
}