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): boolParameter
$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 eineE_WARNINGaus.
unlink()ist das Gegenstück zu Funktionen, die Dateien erstellen, wiefopen()undfile_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() vs rmdir()
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
falsezurück und warnt. Prüfen Sie zuerst mitfile_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.