2010-02-05 11 views
20

Ich habe einen Cache-Ordner, der HTML-Dateien speichert. Sie werden bei Bedarf überschrieben, aber oft werden dort auch selten genutzte Seiten zwischengespeichert, die am Ende nur Platz benötigen (nach 5 Wochen war das Laufwerk voll mit über 2,7 Millionen Cache-Dateien).Wie löscht man Dateien aus dem Verzeichnis basierend auf dem Erstellungsdatum in PHP?

Was ist der beste Weg, um durch ein Verzeichnis zu laufen, das mehrere hunderttausend Dateien enthält, und Dateien zu entfernen, die älter als 1 Tag sind?

+4

Gibt es einen Grund, warum Sie dies in PHP tun müssen? Möglicherweise finden Sie dafür eine Shell-Skriptsprache. –

+0

Sie können all dies und mehr mit [Linux 'find' Befehl] tun (https://askubuntu.com/a/589224/372950) – rinogo

Antwort

37

Ich denke, Sie könnten gehen dies mit readdir durch das Verzeichnis Looping und löschen auf dem Zeitstempel basiert:

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

    while (false !== ($file = readdir($handle))) { 
     $filelastmodified = filemtime($path . $file); 
     //24 hours in a day * 3600 seconds per hour 
     if((time() - $filelastmodified) > 24*3600) 
     { 
      unlink($path . $file); 
     } 

    } 

    closedir($handle); 
} 
?> 

Die if((time() - $filelastmodified) > 24*3600) werden Dateien auswählen, die älter als 24 Stunden (24 Stunden mal 3600 Sekunden pro Stunde). Wenn Sie Tage wollten, sollte es zum Beispiel 7 * 24 * 3600 für Dateien älter als eine Woche lesen.

Beachten Sie außerdem, dass filemtime den Zeitpunkt der letzten Änderung der Datei anstelle des Erstellungsdatums zurückgibt.

4

Die unten Funktion listet die Datei auf der Grundlage ihres Erstellungsdatum:

private function listdir_by_date($dir){ 
    $h = opendir($dir); 
    $_list = array(); 
    while($file = readdir($h)){ 
    if($file != '.' and $file != '..'){ 
     $ctime = filectime($dir . $file); 
     $_list[ $file ] = $ctime; 
    } 
    } 
    closedir($h); 
    krsort($_list); 
    return $_list; 
} 

Beispiel:

$_list = listdir_by_date($dir); 

Jetzt können Sie Schleife durch die Liste ihrer Daten zu sehen und löschen entsprechend:

$now = time(); 
$days = 1; 
foreach($_list as $file => $exp){ 
    if($exp < $now-60*60*24*$days){ 
    unlink($dir . $file); 
    } 
} 
3

Versuchen SplIterators

// setup timezone and get timestamp for yesterday 
date_default_timezone_set('Europe/Berlin'); // change to yours 
$yesterday = strtotime('-1 day', time()); 

// setup path to cache dir and initialize iterator 
$path  = realpath('/path/to/files'); // change to yours 
$objects = new RecursiveIteratorIterator(
       new RecursiveDirectoryIterator($path)); 

// iterate over files in directory and delete them 
foreach($objects as $name => $object){ 
    if ($object->isFile() && ($object->getCTime() < $yesterday)) { 
     // unlink($object); 
     echo PHP_EOL, 'deleted ' . $object; 
    } 
} 

Creation Time is only available on Windows.

9

Es

if((time()-$filelastmodified) > 24*3600 && is_file($file)) 
sollte

zu vermeiden Fehler für die . und .. Verzeichnisse.

+1

Besser zu prüfen, ob' $ file == '.' || $ file == '..' 'um Zeit zu sparen, wenn' is_file() 'jedes Mal überprüft wird ... – barell

-1

Durch Ändern der @ pawel-Lösung habe ich die Funktion unten erstellt. Zuerst habe ich vergessen, "Pfad" zu Dateinamen hinzuzufügen, die meine halbe Stunde dauern, um herauszufinden.

public function deleteOldFiles ($hours=24) { 
    $path='cache'.DS; 
    if ($handle = opendir($path)) { 
     while (false !== ($file = readdir($handle))) { 
      $filelastmodified = filemtime($path.$file); 
      if((time()-$filelastmodified) > 24*3600 && is_file($path.$file)) 
      { 
       unlink($path.$file); 
      } 
     } 
     closedir($handle); 
    } 
} 
0

nur Gordons Zeitvergleich zu beachten (siehe oben: https://stackoverflow.com/a/2205833/1875965) ist die einzige richtige, wenn anstatt '24 Stunden zu ‚Tage‘ zu vergleichen, da nicht alle Tage haben 24 Stunden (Sommerzeit/Winterzeit usw.) .

z. Verwenden Sie

// setup timezone and get timestamp for yesterday 
date_default_timezone_set('Europe/Berlin'); // change as appropriate 
$yesterday = strtotime('-1 day', time()); 

beim Vergleichen des Dateidatums.

Dies mag kein großes Problem sein, kann aber zu unerwartetem Verhalten führen, wenn Sie mit Wochen/Monaten usw. arbeiten. Ich fand es am besten, die oben genannte Methode zu verwenden Mal konsistent und vermeide Verwirrung.

Überprüfen Sie auch, was die Zeitzone für die Dateidaten ist, da sich der Standard für PHP manchmal von der Systemzeitzone unterscheidet.

Mit freundlichen Grüßen, Sandra.

+0

good point. für lange Zeiträume sollte Zeitzone berücksichtigen. . . – Atara

1
/* Detele 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() - 3600) { // 1 hour 
    unlink($file); 
    } 
} 

Ich benutze dies, hoffe es hilft.

Verwandte Themen