W3docs

unlink()

Die PHP-Funktion unlink() löscht eine Datei aus dem Dateisystem. Hier erfahren Sie Syntax, Rückgabewert, Berechtigungen und häufige Fallstricke.

Einführung

Die PHP-Funktion unlink() löscht eine einzelne Datei aus dem Dateisystem. Der Name stammt vom zugrunde liegenden Unix-Systemaufruf unlink, der einen Namen (einen „Link") entfernt, der auf die Daten einer Datei zeigt. Wenn der letzte Link zu einer Datei entfernt wird, wird die Datei selbst freigegeben.

Dieses Kapitel behandelt die Syntax, den Rückgabewert, Berechtigungsregeln und – ebenso wichtig – die Fallstricke: unterdrückte Warnungen, das Löschen nur wenn eine Datei existiert, und warum unlink() keine Verzeichnisse entfernen kann.

Syntax

unlink(string $filename, ?resource $context = null): bool

Parameter

  • $filename — der Pfad zur zu löschenden Datei. Er kann relativ zum aktuellen Arbeitsverzeichnis oder ein absoluter Pfad sein.
  • $context (optional) — eine Stream-Kontext-Ressource, die für erweiterte Fälle wie das Löschen über einen Stream-Wrapper (z. B. FTP) verwendet wird. Sie werden sie selten benötigen.

Rückgabewert

  • true, wenn die Datei erfolgreich gelöscht wurde.
  • false, wenn es fehlgeschlagen ist — zum Beispiel, wenn die Datei nicht existiert, der Pfad auf ein Verzeichnis zeigt oder dem Prozess die Berechtigung fehlt. Bei einem Fehler gibt PHP auch eine E_WARNING aus.

unlink() ist das Gegenstück zu Funktionen, die Dateien erstellen, wie fopen() und file_put_contents().

Ein einfaches Beispiel

Überprüfen Sie immer den Rückgabewert, damit Ihr Skript weiß, ob die Löschung tatsächlich stattgefunden hat:

<?php
// Create a file so we have something to delete.
file_put_contents('example.txt', 'temporary data');

if (unlink('example.txt')) {
    echo "File deleted successfully.";
} else {
    echo "Failed to delete the file.";
}

Ausgabe:

File deleted successfully.

Nur löschen, wenn die Datei existiert

Der Aufruf von unlink() auf eine fehlende Datei gibt false zurück und erzeugt eine Warnung. Schützen Sie den Aufruf mit file_exists() (oder is_file()), um störende Warnungen zu vermeiden:

<?php
$path = 'cache/report.tmp';

if (file_exists($path)) {
    unlink($path);
    echo "Removed: {$path}";
} else {
    echo "Nothing to remove.";
}

Wenn cache/report.tmp nicht existiert, gibt dies Nothing to remove. aus, anstatt eine Warnung auszulösen.

Fehler sauber behandeln

In der Produktion möchten Sie oft auf einen fehlgeschlagenen Löschvorgang reagieren, anstatt abzustürzen. Der @-Operator unterdrückt die Warnung, aber ein saubererer Ansatz ist, das Ergebnis zu prüfen und es selbst zu melden:

<?php
$path = 'logs/old.log';

if (!@unlink($path)) {
    // file_exists() distinguishes "already gone" from a real permission error.
    if (file_exists($path)) {
        echo "Could not delete {$path} — check permissions.";
    } else {
        echo "File was already gone.";
    }
}

Berechtigungen: Wer darf eine Datei löschen

Eine häufige Überraschung: Die Berechtigung zum Löschen einer Datei wird durch das Verzeichnis gesteuert, nicht durch die Datei. Um eine Datei zu entfernen, benötigt der PHP-Prozess (z. B. der Webserver-Benutzer wie www-data) Schreib- und Ausführungsberechtigung für das Verzeichnis, das sie enthält — auch wenn die Datei selbst schreibgeschützt ist. Wenn Sie „Zugriff verweigert"-Fehler erhalten, untersuchen Sie die Berechtigungen des übergeordneten Verzeichnisses, nicht nur die der Datei.

Mehrere Dateien löschen

unlink() entfernt jeweils eine Datei. Um mehrere Dateien zu löschen, die einem Muster entsprechen, kombinieren Sie es mit glob():

<?php
// Delete every .tmp file in the cache directory.
foreach (glob('cache/*.tmp') as $file) {
    unlink($file);
}

glob() gibt ein Array mit übereinstimmenden Pfaden zurück (oder ein leeres Array, wenn keine übereinstimmen), sodass die Schleife einfach nichts tut, wenn nichts zu löschen ist.

unlink() funktioniert nur mit Dateien. Wenn Sie ein Verzeichnis übergeben, schlägt es fehl und warnt. Um ein Verzeichnis zu entfernen, verwenden Sie rmdir() — und beachten Sie, dass rmdir() nur mit einem leeren Verzeichnis funktioniert. Das Entfernen eines nicht leeren Verzeichnisses bedeutet, zuerst seinen Inhalt zu löschen (mit unlink() für Dateien und rmdir() für Unterverzeichnisse) und dann das Verzeichnis selbst zu entfernen.

Häufige Fallstricke

  • Die Datei muss existieren. Eine fehlende Datei gibt false zurück und warnt. Prüfen Sie zuerst mit file_exists().
  • Es ist dauerhaft. unlink() verschiebt die Datei nicht in einen Papierkorb; die Daten sind sofort weg.
  • Nicht für Verzeichnisse. Verwenden Sie rmdir() für Verzeichnisse.
  • Stat-Cache. Nach dem Löschen einer Datei kann PHP sie aufgrund des Stat-Caches noch als vorhanden melden. Rufen Sie clearstatcache() auf, wenn Sie denselben Pfad in einer engen Schleife erneut prüfen.
  • Offene Datei-Handles. Unter Windows können Sie eine Datei nicht löschen, die noch geöffnet ist; schließen Sie sie zuerst mit fclose(). Unter Unix ist das Löschen erlaubt, aber die Daten bleiben, bis das letzte Handle geschlossen wird.

Fazit

unlink() ist PHPs unkomplizierter Weg, eine einzelne Datei zu löschen, gibt bei Erfolg true und bei Misserfolg false (plus eine Warnung) zurück. Die wichtigsten Praktiken sind: Prüfen Sie, ob die Datei vor dem Löschen existiert, überprüfen Sie immer den Rückgabewert, denken Sie daran, dass die Löschberechtigung vom Verzeichnis abhängt, und greifen Sie auf rmdir() zurück, wenn Sie Verzeichnisse entfernen müssen. Für einen umfassenderen Überblick über das Lesen, Schreiben und Verwalten von Dateien, siehe PHP File Handling.

Übungen

Übung
Was ist die Funktion von 'unlink()' in PHP?
Was ist die Funktion von 'unlink()' in PHP?
Was this page helpful?