Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
 
 
 

Datei nach Alter loeschen

Sie befinden sich: Home > Php Tutorial > Datei nach Alter loeschen

Datei nach Alter loeschen


Eintrag am:  12.08.2010
Hits / Besucher:  71107
Sprache:  Deutsch
Kategorie:  Einsteiger Tutorials
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

Es gibt viele Anwendungsfälle, bei denen eine Datei gelöscht werden soll, wenn sie ein bestimmtes Alter überschritten hat. Ein Beispiel hierfür ist eine Software, die täglich Logdateien erstellt, und diese in einem bestimmten Verzeichnis ablegt. Um Speicherplatz zu sparen, können Sie zum Beispiel die Logdateien für einen bestimmten Zeitraum vorhalten. Alle Dateien, die älter sind, werden regelmäßig gelöscht. Im folgenden Beispiel wird ein Script beschrieben, das alle Dateien aus einem Verzeichnis löscht, die älter als 2 Wochen sind.

So funktioniert das Löschscript

Das Script durchläuft ein Verzeichnis, prüft jede Datei auf ihr Alter und löscht sie, wenn der festgelegte Zeitraum überschritten ist. Das folgende Diagramm zeigt den Ablauf:

graph TD
    A[Verzeichnis öffnen] --> B[Nächste Datei lesen]
    B --> C{Noch Dateien vorhanden?}
    C -->|Nein| D[Fertig]
    C -->|Ja| E{Ist es eine Datei?}
    E -->|Nein| B
    E -->|Ja| F{Älter als Grenzwert?}
    F -->|Nein| B
    F -->|Ja| G[Datei löschen]
    G --> B

Hier ist das vollständige Script:

<?php

/*
* Created on 30.01.2010 by Nico Schubert
*/
$dir =
$_SERVER["DOCUMENT_ROOT"].dirname($_SERVER['PH
P_SELF']).'/test/';
$folder = dir($dir);
while ($dateiname = $folder->read()) {
if (filetype($dir.$dateiname) != "dir") {
if (strtotime("-2 weeks") >
@filemtime($dir.$dateiname)) {
if (@unlink($dir.$dateiname) != false)
echo $dateiname.' wurde gelöscht<br>';
else
echo $dateiname.' konnte nicht
gelöscht werden<br>';
}
}
}
echo "Fertig";
$folder->close();
exit;
?>



Erklärung des Scripts

In der ersten Zeile des Scriptes wird der Pfad zum Verzeichnis „test“ festgelegt, in dem die Testdateien gespeichert sind. Durch die erste Codezeile wird der Pfad, in dem sich das gerade ausgeführte Script befindet, in der Variablen $dir gespeichert. Dieser Pfad wird ergänzt um /test/. In der zweiten Codezeile werden mit der dir()-Anweisung alle Dateinamen im Verzeichnis test ermittelt, und in der Variablen $folder gespeichert. In der nächsten Zeile wird mit der read-Anweisung jeder Dateiname einzeln aus der Variablen $folder gelesen und in $dateiname gespeichert. Der Aufruf der while-Schleife bewirkt, dass die nachfolgenden Aktionen, die zwischen den geschweiften Klammern stehen, für jeden Dateinamen, der in $folder gespeichert ist, ausgeführt werden.

Als erste Aktion innerhalb der Schleife wird in der nächsten Codezeile geprüft, ob es sich bei dem aktuellen Namen um einen Dateinamen oder um einen Verzeichnisnamen handelt. Dies wird mit der Funktion filetype() geprüft. Wenn es sich um einen Verzeichnisnamen handelt, dann gibt die Funktion „dir“ zurück. In diesem Fall ist das Ergebnis der if-Abfrage false und der Schleifendurchlauf ist an dieser Stelle zu Ende, weil mit diesem Script nur Dateien gelöscht werden sollen. Verzeichnisse sollen nicht gelöscht werden.


In der nächsten Zeile wird geprüft, ob die aktuelle Datei älter als zwei Wochen ist. Hierzu wird zunächst mit der Funktion strtotime("-2 weeks“) das aktuelle Datum minus zwei Wochen ermittelt. Das letzte Änderungsdatum der Datei ermittelt die Funktion filemtime(), die als Parameter den entsprechenden Dateinamen übergeben bekommt. Wenn die Datei älter als zwei Wochen ist, dann wird sie in der nächsten Zeile mit der unlink()-Anweisung aus dem Verzeichnis „test“ gelöscht. Das @-Zeichen vor der unlink()-Anweisung bewirkt, dass Fehlermeldungen von PHP unterdrückt werden, falls die Datei nicht erfolgreich gelöscht werden kann. Wenn die Datei gelöscht werden konnte, gibt die unlink()-Funktion den Wert true zurück, der in der if-Abfrage abgefragt wird.


Wenn diese Funktion true zurückgibt, dann wird in der nächsten Zeile per echo-Anweisung die Meldung ausgegeben, dass die Datei gelöscht wurde. Konnte die Datei nicht gelöscht werden, dann gibt die Funktion unlink() den Wert false zurück. In diesem Fall wird im else-Zweig der if-Abfrage die Meldung ausgegeben, dass die Datei nicht gelöscht werden konnte. Wenn die Schleife für alle Dateien im Verzeichnis test durchlaufen wurde, dann wird der Programmcode hinter der geschlossenen geschweiften Klammer ausgeführt. Zunächst wird per echo-Anweisung die Meldung Fertig ausgegeben.

Mit der Anweisung $folder->close; wird die Verbindung zum Verzeichnis „test“ beendet und das Verzeichnis wird wieder freigegeben. Danach wird in der letzten Codezeile die Ausführung des Scriptes durch die Anweisung exit; beendet.

Dieses Beispiel zeigt ein einfaches Script, mit dem eine Datei in Abhängigkeit von ihrem Alter gelöscht werden kann. Wenn Sie ein solches Script regelmäßig ausführen, um unter anderem automatisch erstellte Logdateien zu löschen, verhindern Sie, dass ein Verzeichnis zu voll wird und unnötig viel Speicherplatz belegt wird. Um einen anderen Zeitraum zu wählen, nach dem die Dateien gelöscht werden, müssen Sie lediglich den Parameter der Funktion strtotime() verändern. Setzen Sie hier statt „-2 weeks“ den Wert „-5 days“, dann werden alle Dateien gelöscht, die älter als 5 Tage sind.

Moderner Ansatz mit __DIR__ und Fehlerbehandlung

Das obige Script stammt aus einer älteren PHP-Version. Heute empfiehlt sich ein sauberer Ansatz mit __DIR__ statt $_SERVER, ohne @-Fehlerunterdrückung und mit konfigurierbaren Parametern:

<?php

$sVerzeichnis = __DIR__ . "/logs/";
$sMaxAlter = "-2 weeks";

if (!is_dir($sVerzeichnis)) {
echo "Verzeichnis existiert nicht";
exit(1);
}

$iGrenzzeit = strtotime($sMaxAlter);
$iGeloescht = 0;

foreach (new DirectoryIterator($sVerzeichnis) as $oDatei) {
if ($oDatei->isDot() || $oDatei->isDir()) {
continue;
}
if ($oDatei->getMTime() < $iGrenzzeit) {
if (unlink($oDatei->getPathname())) {
$iGeloescht++;
}
}
}
echo $iGeloescht . " Dateien gelöscht";
?>

Dieser Ansatz nutzt den DirectoryIterator, der sauberer als dir() ist und direkte Methoden wie isDot(), isDir() und getMTime() bietet.

Alternative: glob() für einfache Fälle

Wenn du nur bestimmte Dateitypen löschen willst, ist glob() die kürzere Variante:

<?php

$sVerzeichnis = __DIR__ . "/logs/";
$iGrenzzeit = strtotime("-2 weeks");

foreach (glob($sVerzeichnis . "*.log") as $sDatei) {
if (filemtime($sDatei) < $iGrenzzeit) {
unlink($sDatei);
}
}
?>

glob() eignet sich, wenn du nur Dateien mit einer bestimmten Endung brauchst (z.B. *.log, *.tmp). Für volle Kontrolle über den Verzeichnisinhalt ist der DirectoryIterator besser geeignet.

Sicherheitshinweise

Ein Löschscript kann großen Schaden anrichten, wenn es falsch konfiguriert ist. Beachte diese Punkte:

  • Pfad genau festlegen: Verwende niemals / oder ../ als Verzeichnis. Setze den Pfad immer absolut oder relativ zu __DIR__.
  • Dateiendungen filtern: Lösche nur Dateien mit bestimmten Endungen (z.B. .log, .tmp). So bleiben wichtige Dateien wie .htaccess oder index.php erhalten.
  • Symlinks beachten: unlink() folgt Symlinks. Ein Angreifer könnte einen Symlink auf eine wichtige Datei setzen. Prüfe mit is_link(), ob die Datei ein Symlink ist.
  • Löschvorgänge protokollieren: Schreibe gelöschte Dateinamen in eine Logdatei, um Fehler nachvollziehen zu können.

Automatische Ausführung per Cronjob

Das Script entfaltet seinen Nutzen erst, wenn es regelmäßig läuft. Auf einem Linux-Server richtest du einen Cronjob ein:

/* Cronjob: Täglich um 3 Uhr morgens */

0 3 * * * php /var/www/html/cleanup.php

Bei Shared-Hosting-Anbietern findest du die Cronjob-Verwaltung im Kundenpanel. Trage dort den Pfad zum PHP-Script und den gewünschten Zeitplan ein.

Unterschied: filemtime() vs. filectime()

filemtime() liefert den Zeitpunkt der letzten Inhaltsänderung. filectime() gibt die letzte Statusänderung zurück (z.B. geänderte Rechte oder Besitzer). Auf Windows liefert filectime() das Erstellungsdatum. Für die meisten Löschscripts ist filemtime() die richtige Wahl, weil es das tatsächliche Alter des Dateiinhalts widerspiegelt.

Häufige Fragen

Wie lösche ich nur bestimmte Dateitypen?

Verwende glob() mit einem Pattern wie glob($dir . "*.log") oder prüfe die Endung mit pathinfo($datei, PATHINFO_EXTENSION) im Iterator.

Was passiert, wenn eine Datei gerade geöffnet ist?

Auf Linux löscht unlink() den Verzeichniseintrag, die Datei bleibt aber verfügbar, bis der letzte Prozess sie schließt. Auf Windows schlägt unlink() fehl, wenn die Datei gerade von einem anderen Prozess gesperrt ist.

Kann ich Dateien statt Löschen in einen Papierkorb verschieben?

Ja. Ersetze unlink($datei) durch rename($datei, $papierkorbPfad . basename($datei)). So kannst du versehentlich gelöschte Dateien wiederherstellen.

Fazit

Das automatische Löschen von Dateien nach ihrem Alter gehört zu den häufigsten Wartungsaufgaben. Mit DirectoryIterator, filemtime() und unlink() hast du alle Werkzeuge, die du brauchst. Achte auf Sicherheit, filtere Dateiendungen und richte einen Cronjob ein, damit das Script automatisch läuft.

 

Tags:

 

Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.