web-dev-qa-db-fra.com

La bonne façon de supprimer tous les fichiers de plus de 2 jours PHP

Juste curieux

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

Je veux juste m'assurer que le code est correct ou non. Merci.

33
user4951

Vous devez ajouter une vérification is_file() , car PHP répertorie normalement . ET .. , ainsi que des sous-répertoires pouvant résider dans le répertoire que vous vérifiez.

En outre, comme cette réponse suggère , vous devez remplacer les secondes précalculées par une notation plus expressive.

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

Vous pouvez également utiliser la variable DirectoryIterator, comme indiqué dans cette réponse . Dans ce cas simple, cela n'apporte pas vraiment d'avantages, mais ce serait OOP.

77
buschtoens

Le moyen le plus simple consiste à utiliser 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

Une autre manière plus simple et plus moderne, en utilisant FilesystemIterator .

J'utilise le répertoire 'logs' comme exemple.

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

Le principal avantage est: DirectoryIterator renvoie les répertoires virtuels "." et ".." dans une boucle . Mais FilesystemIterator les ignore.

8
Maksim.T

Semble correct pour moi. Je suggérerais simplement de remplacer 172800 par 2*24*60*60 pour plus de clarté.

4
Niet the Dark Absol

Sachez que vous rencontrerez des problèmes si vous avez un très grand nombre de fichiers dans le répertoire.

Si vous pensez que cela est susceptible de vous affecter, envisagez une approche de niveau inférieur telle que opendir .

2
John Carter

Voici un exemple de la façon de le faire récursivement.

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

J'espère que ça vous aidera.

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