kostenloser Webspace werbefrei: lima-city


alte Dateien aus Ordner löschen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    spielzeug

    spielzeug hat kostenlosen Webspace.

    Hallo

    wie kann ich es am besten machen, dass alle tag/re">ref="/tag/datei">Dateien in einem Ordner (data/)
    die älter als 3 Tage sind, automatisch gelöscht werden

    was ist besser mit readdir() oder mit glob() oder ... was verbraucht weniger Ressourcen ?

    a) Lösch-Funktion mit opendir() und readdir()
    function delete_old_files1 ($path='data/', $days=3) { 
    $dir = opendir( $path ); 
    $i=0;
    while($file = readdir($dir)){ 
        if (!is_dir($file) && $file != '.' && $file != '..')){ 
          $time_limit = time()-(36000*24*$days); 
            if(filemtime($path.$file) >= $time_limit){ 
                unlink($path.$file); 
    			$i++; 
            } 
        } 
    } 
    return $i; 
    }


    b) Lösch-Funktion mit glob()
    function delete_old_files2 ($path='data/', $days=3) { 
    $files = glob($path.'*');
    $i=0;
    foreach ($files as $file) {
        if (!is_dir($file) && $file != '.' && $file != '..')){ 
          $time_limit = time()-(36000*24*$days); 
            if(filemtime($path.$file) >= $time_limit){ 
                unlink($path.$file); 
    			$i++; 
            } 
        } 
    }
    return $i; 
    }


    welche Variante ist die beste, oder gehts noch ganz anders besser ?
    (wobei besser = Ressourchen schonender / schneller)

    ... wie würdet Ihr so eine "Säuberungs-Funktion" machen?
    (alle Dateien in Ordner x löschen, die älter als n Tage sind)

    Danke
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. ich würde die funktion mit glob nehmen, allerdings als übergabe parameter das * mit rein nehmen.

    vorteil ist, du kannst auch einzeldateien löschen, indem du einfach den übergabeparameter änderst und sparst funktionen für andere löschoperationen. du kannst die klasse dann mit * aufrufen. oder dateien nach einem betimmten muster löschen... du würdest dich flexibel halten und nicht für jede löschoperation eine neue Funktion schreiben.


    Des weiteren würde ich den Timestamp in einer extra funktion berechnen lassen und nicht mitten in der funktion. die hat da ncihts zu suchen. dann kannst du auch feiner skalieren, was zeiten angeht( vor allem kannst du das zeitkriterium besser aussortieren, wenn du sagst timestamp=-1 ->keine zeitangabe erforderlich.


    noch besser wäre es, du baust das array, wo du deine Dateieinträge abfragst auch in einer extra funktion auf, dann kannst du ohne löschen auch dateien abfragen. dann machst du den return bei der löschfunktion auf erfolgreich oder fehler und die dateiliste bekommst du eh so, damit du auch weißt, welche dateien du löscht.

    was soll das eigentlich werden? nur eine bereinigungsfujktion für einen logeinträge/cache ordner oder teil eines größeren projekts?


    gruß,

    sebulon
  4. Autor dieses Themas

    spielzeug

    spielzeug hat kostenlosen Webspace.

    es ist "nur" für Cache-Daten löschen, die "veraltet" sind.

    wegen Aufteilung in mehrere Funktionen, meist Du es etwa so
    dass ich für jede Datei die Lösch-Funktion einzeln aufrufen soll,
    oder doch gleich ein Array übergeben, und die foreach-Schleife dann innerhalb der Lösch-Funktion ?

    Und eine Rückgabe, welche Datei jetzt genau gelöscht wurde, brauche ich garnicht ,
    auch weil je Dateiname ein nichts-sagender MD5-Hash mit Endung .xml ist
    wichtig ist mir halt, dass sich im Cache-Odner kein Datenmüll ansammelt,

    Warum hat time() innerhalb einer Funktion nichts zu suchen?
    ist es nicht egal ob ich Timestamp als Parameter übergebe oder in der Funktion auf den Wert komme
    ... das Resultat ist doch das gleiche ?! .. und ich möchte es eben gerne "kompakt" in einer Funktion

    Interessant wäre aber, das mit Fehler abfangen,
    also ob Löschung der Datei erfolgreich war.

    hier nochmal alles in einer Funktion:
    function delete_old_files ($path='data/', $days=3, $tmsp=time();) {
    $files = glob($path.'*');
    $i=0;
    $res = array(); 
    foreach ($files as $file) {
        if (!is_dir($file) && $file != '.' && $file != '..')){
          $time_limit = $tmsp-(36000*24*$days);
            if(filemtime($path.$file) >= $time_limit){ 
                $res[$i]['name'] = $file; 
                if (@unlink($path.$file)) { $res[$i]['status'] = 'ok'; } else { $res[$i]['status'] = 'error'; } 
                $i++;
            }
        }
    }
    return $res;
    }


    ob ich jetzt die Zeile mit dem unlink() in eine Extra-Funktion packe, sehe ich keinen Vorteil,
    im Gegenteil, dann ist es nicht mehr so schön "Kompakt" ... all_in_one
    so mit nur einer Funktion rufe ich 1x am Tag delete_old_files() auf und gut is ?!

    ... apropos 1x am Tag aufrufen ... gibt es hier bei Lima-City auch Cron-Jobs ?

  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!