it-swarm-pt.tech

A maneira correta de excluir todos os arquivos com mais de 2 dias em PHP

Apenas curioso

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

Eu só quero ter certeza se o código está correto ou não. Obrigado.

33
user4951

Você deve adicionar um is_file() check, porque PHP normalmente lista . E .. , assim como subdiretórios que podem residir no diretório que você está verificando.

Além disso, como esta resposta sugere , você deve substituir os segundos pré-calculados por uma notação mais expressiva.

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

Alternativamente, você também pode usar o DirectoryIterator, como mostrado nesta resposta . Neste caso simples, ele realmente não oferece vantagens, mas seria OOP.

77
buschtoens

A maneira mais fácil é usando 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());
        }
    }
}
?>
47
Stefanie Janine Stölting

Outra maneira mais simples e moderna, usando FilesystemIterator .

Estou usando o diretório 'logs' como exemplo.

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

A principal vantagem é: DirectoryIterator retorna diretórios virtuais "." e ".." em um loop. Mas o FilesystemIterator os ignora.

8
Maksim.T

Parece correto para mim. Sugiro que você substitua 172800 por 2*24*60*60 para maior clareza.

4
Niet the Dark Absol

Esteja ciente de que você terá problemas se tiver um grande número de arquivos no diretório.

Se você acha que isso provavelmente afetará você, considere usar uma abordagem de nível inferior, como opendir .

2
John Carter

Aqui está um exemplo de como fazer isso de forma recursiva.

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

Espero que te ajude.

1
Lachit
/** 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);
    }
}
0
Miguel