Signatur
Beschreibung
rmdir() entfernt das angegebene Verzeichnis aus dem Dateisystem. Das Verzeichnis muss leer sein und der laufende Prozess muss über die entsprechenden Berechtigungen verfügen, andernfalls schlägt die Funktion fehl und gibt false zurück.
Soll ein Verzeichnis rekursiv gelöscht werden (d. h. inklusive aller Unterverzeichnisse und Dateien), muss zunächst der Inhalt manuell entfernt werden – z. B. mit einer rekursiven Hilfsfunktion oder glob() –, da PHP keine eingebaute Entsprechung zu rm -rf kennt.
Über den optionalen Parameter context lässt sich ein Stream-Kontext übergeben, der z. B. bei Netzwerkdateisystemen (FTP, SSH2) nützlich ist und das Verhalten des Löschvorgangs beeinflusst.
Schlägt der Aufruf fehl, wird ein E_WARNING ausgelöst. Mit dem Fehlerunterdrückungsoperator @ oder einer eigenen Fehlerbehandlung lässt sich das steuern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $directory Pflicht | string | Pfad zum zu löschenden Verzeichnis. Kann relativ oder absolut angegeben werden. | |
| $context | resource|null | null | Optionaler Stream-Kontext, erstellt z. B. mit stream_context_create(). Nützlich beim Arbeiten mit Netzwerkdateisystemen. |
Rückgabewert
true zurück, wenn das Verzeichnis erfolgreich gelöscht wurde, andernfalls false. Ein Fehlschlag tritt auf, wenn das Verzeichnis nicht leer ist, nicht existiert oder die Berechtigungen fehlen.Beispiele
Einfaches Löschen eines leeren Verzeichnisses
<?php
$dir = '/tmp/mein_verzeichnis';
// Verzeichnis anlegen
mkdir($dir);
// Verzeichnis wieder löschen
if (rmdir($dir)) {
echo "Verzeichnis erfolgreich gelöscht.";
} else {
echo "Löschen fehlgeschlagen.";
}
Rekursives Löschen eines Verzeichnisses mit Inhalt
<?php
function rmdir_rekursiv(string $pfad): bool
{
if (!is_dir($pfad)) {
return false;
}
$eintraege = array_diff(scandir($pfad), ['.', '..']);
foreach ($eintraege as $eintrag) {
$vollpfad = $pfad . DIRECTORY_SEPARATOR . $eintrag;
if (is_dir($vollpfad)) {
rmdir_rekursiv($vollpfad);
} else {
unlink($vollpfad);
}
}
return rmdir($pfad);
}
// Teststruktur anlegen
mkdir('/tmp/test_baum/unterordner', 0777, true);
file_put_contents('/tmp/test_baum/unterordner/datei.txt', 'Inhalt');
// Gesamten Baum löschen
if (rmdir_rekursiv('/tmp/test_baum')) {
echo "Verzeichnisbaum vollständig gelöscht.";
} else {
echo "Löschen fehlgeschlagen.";
}
// Wichtig · Fallstricke
Sicherheitshinweis: Übergeben Sie niemals ungeprüfte Benutzereingaben direkt an rmdir(). Ein Angreifer könnte durch Path-Traversal-Sequenzen wie ../../ beliebige Verzeichnisse auf dem Server löschen. Validieren und canonicalisieren Sie Pfade stets mit realpath() und prüfen Sie, ob der Pfad innerhalb des erlaubten Basisverzeichnisses liegt.
Auf Windows-Systemen kann das Löschen fehlschlagen, wenn das Verzeichnis oder eine darin enthaltene Datei noch von einem anderen Prozess geöffnet ist.
Keine rekursive Löschung: Anders als der Unix-Befehl rm -r löscht rmdir() ausschließlich leere Verzeichnisse. Für rekursives Löschen ist eine eigene Implementierung erforderlich (siehe Beispiel 2).