delete()
Die Funktion unlink() in PHP löscht eine Datei vom Dateisystem. Wichtig für Server-Admins und Webentwickler zur Dateiverwaltung.
Wie man in PHP mit unlink() eine Datei löscht
PHP hat keine delete()-Funktion. Um eine Datei im Dateisystem zu löschen, verwendet man unlink() — der Name stammt vom zugrunde liegenden Unix-Systemaufruf, der den Namen einer Datei (ihren „Link") aus einem Verzeichnis entfernt. Wenn der letzte Link entfernt ist, werden die Daten der Datei freigegeben.
Diese Seite erklärt, was unlink() tut, welche Fallstricke es gibt (fehlende Dateien, Berechtigungen, relative Pfade) sowie die verwandten Funktionen, die man nutzt, wenn unlink() nicht das richtige Werkzeug ist — etwa rmdir() für Verzeichnisse und glob() zum Löschen vieler Dateien auf einmal.
Das Löschen einer Datei (
unlink()) ist nicht dasselbe wie das Löschen von Datenbankeinträgen — dafür führt man eine SQL-DELETE-Abfrage aus, keinen Dateisystemaufruf.
Syntax
unlink(string $filename, ?resource $context = null): bool$filename— der Pfad zur Datei, die gelöscht werden soll. Er kann absolut sein (/var/www/data.txt) oder relativ zum Arbeitsverzeichnis des Skripts (uploads/data.txt).$context— (optional) ein Stream-Kontext, der nur mit Stream-Wrappern wieftp://verwendet wird. Für lokale Dateien selten benötigt.
unlink() gibt bei Erfolg true und bei Fehler false zurück. Bei einem Fehler gibt sie außerdem eine E_WARNING-Meldung aus — zum Beispiel wenn die Datei nicht existiert oder der Prozess keine Berechtigung hat, sie zu löschen.
Immer das Ergebnis prüfen
Ein einfaches unlink("file.txt") hinterlässt still eine Warnung in den Logs, wenn die Datei fehlt. Prüfe den Rückgabewert und verwende, wenn die Datei möglicherweise nicht existiert, vorab file_exists(), um keine Warnung auszulösen:
$path = "report.txt";
if (file_exists($path)) {
if (unlink($path)) {
echo "Deleted $path\n";
} else {
echo "Could not delete $path (check permissions)\n";
}
} else {
echo "Nothing to delete: $path does not exist\n";
}Beispiele
Beispiel 1: Eine Datei erstellen und dann löschen
Dieses in sich geschlossene Beispiel erstellt eine temporäre Datei, bestätigt ihre Existenz, löscht sie mit unlink() und bestätigt, dass sie verschwunden ist:
$path = sys_get_temp_dir() . "/w3docs-demo.txt";
file_put_contents($path, "temporary data");
echo "Exists before delete? " . (file_exists($path) ? "yes" : "no") . "\n";
unlink($path);
echo "Exists after delete? " . (file_exists($path) ? "yes" : "no") . "\n";Ausgabe:
Exists before delete? yes
Exists after delete? noBeispiel 2: Alle passenden Dateien mit glob() löschen
unlink() löscht eine Datei pro Aufruf. Um eine Gruppe von Dateien zu bereinigen, kombiniert man es mit glob(), das ein array von passenden Pfaden zurückgibt:
foreach (glob("/tmp/cache/*.tmp") as $file) {
unlink($file);
}Damit werden alle .tmp-Dateien in /tmp/cache entfernt. Dasselbe Muster ist der Standardweg, um ein Verzeichnis von Dateien zu „leeren", bevor das Verzeichnis selbst mit rmdir() entfernt wird (das nur bei leeren Verzeichnissen funktioniert).
Beispiel 3: Eine Datei über einen Stream-Wrapper löschen
unlink() funktioniert auch mit Stream-Wrappern, einschließlich entfernter. Der optionale $context erlaubt es, wrapper-spezifische Optionen zu übergeben:
$context = stream_context_create([
'ftp' => ['overwrite' => true],
]);
unlink("ftp://example.com/old-export.txt", $context);Häufige Fallstricke
- Die Datei existiert nicht.
unlink()gibtfalsezurück und erzeugt eine Warnung. Verwendefile_exists()oder unterdrücke und prüfe:@unlink($path). - Berechtigungen. Das Löschen hängt von der Schreibberechtigung auf dem enthaltenden Verzeichnis ab, nicht auf der Datei selbst. Der PHP-Prozess (oft
www-data) muss das Verzeichnis besitzen oder Schreibzugriff darauf haben. - Relative Pfade. Ein relativer Pfad wird gegen das aktuelle Arbeitsverzeichnis aufgelöst, das nicht immer dem Ordner des Skripts entspricht. Bevorzuge absolute Pfade oder erstelle sie mit
__DIR__. - Es ist ein Verzeichnis.
unlink()kann keine Verzeichnisse entfernen — verwendermdir()für ein leeres Verzeichnis und lösche zuerst seinen Inhalt. - Die Datei ist geöffnet. Unter Windows schlägt das Löschen einer Datei, die noch von einem Handle geöffnet ist, fehl; schließe sie zuerst. Unter Unix gelingt das Unlink, aber die Daten bleiben erhalten, bis das Handle geschlossen wird.
Verwandte Funktionen
rmdir()— ein leeres Verzeichnis entfernen.file_exists()— prüfen, ob ein Pfad existiert, bevor man ihn löscht.rename()— eine Datei verschieben oder umbenennen, anstatt sie zu löschen.copy()— eine Datei kopieren, bevor man das Original überschreibt oder entfernt.glob()— Dateien nach einem Muster auflisten und sie dann in einer Schleife löschen.
Fazit
Verwende unlink(), um eine einzelne Datei zu löschen, prüfe immer den Rückgabewert und schütze dich mit file_exists(), wenn die Datei möglicherweise nicht vorhanden ist. Für Verzeichnisse nutze rmdir(), und für das Löschen mehrerer Dateien kombiniere unlink() mit glob().