webentwicklung-frage-antwort-db.com.de

Die korrekte Methode zum Löschen aller Dateien, die älter als 2 Tage sind PHP

Nur neugierig

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

Ich möchte nur sicherstellen, ob der Code korrekt ist oder nicht. Vielen Dank.

33
user4951

Sie sollten einen is_file() check hinzufügen, da PHP normalerweise . UND .. sowie Unterverzeichnisse aufführt, die sich in dem Verzeichnis befinden, das Sie überprüfen.

Wie diese Antwort schlägt vor , sollten Sie die vorberechneten Sekunden durch eine ausdrucksstärkere Notation ersetzen.

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

Alternativ können Sie auch die DirectoryIterator, verwenden, wie in dieser Antwort gezeigt . In diesem einfachen Fall bietet es keine Vorteile, aber es wäre OOP.

77
buschtoens

Der einfachste Weg ist die Verwendung von 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());
        }
    }
}
?>

Eine andere, einfachere und modernere Methode, mit FilesystemIterator .

Ich verwende 'logs' als Beispiel.

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

Der Hauptvorteil ist: DirectoryIterator gibt virtuelle Verzeichnisse zurück "." und ".." in einer Schleife . Aber FilesystemIterator ignoriert sie.

8
Maksim.T

Sieht für mich richtig aus. Ich würde nur vorschlagen, dass Sie 172800 durch 2*24*60*60 zur Verdeutlichung ersetzen.

4

Beachten Sie, dass Sie auf Probleme stoßen, wenn sich sehr viele Dateien im Verzeichnis befinden.

Wenn Sie der Meinung sind, dass sich dies wahrscheinlich auf Sie auswirkt, sollten Sie einen Ansatz auf niedrigerer Ebene wie opendir verwenden.

2
John Carter

Hier ist ein Beispiel, wie es rekursiv geht.

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

Ich hoffe es hilft dir.

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