PHP Directory
PHP Directory: Eine umfassende Referenz für PHP-Entwickler zu Verzeichnisfunktionen.
PHP verfügt über eine Reihe eingebauter Verzeichnisfunktionen, mit denen Ihre Skripte Ordner auf dem Dateisystem des Servers untersuchen, erstellen, lesen und entfernen können — ohne auf das Betriebssystem zurückgreifen zu müssen. Diese Seite erklärt, was jede Kernfunktion tut, wann Sie sie einsetzen sollten und welche häufigen Fehler Sie vermeiden müssen.
Diese Seite ergänzt PHP File Handling und die allgemeine PHP Filesystem-Referenz: Dateien befinden sich innerhalb von Verzeichnissen, weshalb beide Themen fast immer gemeinsam verwendet werden.
Warum Verzeichnisoperationen wichtig sind
Fast jede nicht triviale Anwendung greift auf das Dateisystem zu. Sie benötigen Verzeichnisfunktionen, um:
- Hochgeladene Dateien zu organisieren — Benutzer-Uploads in benutzerspezifische oder datumsbasierte Ordner zu sortieren (siehe PHP File Upload).
- Projektstrukturen dynamisch zu erstellen — Cache-, Log- oder Export-Ordner beim ersten Bedarf anzulegen.
- Inhalte zu durchlaufen — alle Templates, Bilder oder Datendateien in einem Ordner aufzulisten, um sie in einem Durchlauf zu verarbeiten.
- Aufzuräumen — temporäre Verzeichnisse zu löschen, sobald ein Job abgeschlossen ist.
Da diese Funktionen zum PHP-Kern gehören, funktionieren sie auf Linux, macOS und Windows gleich (/ wird überall als Trennzeichen akzeptiert), was sie portabler macht als mkdir oder ls über exec() auszuführen.
Kern-Verzeichnisfunktionen
| Funktion | Zweck |
|---|---|
mkdir($path, $mode, $recursive) | Erstellt ein Verzeichnis. Übergeben Sie true für $recursive, um verschachtelte Elternverzeichnisse anzulegen. |
rmdir($path) | Entfernt ein Verzeichnis — es muss zuvor leer sein. |
is_dir($path) | Gibt true zurück, wenn der Pfad existiert und ein Verzeichnis ist. |
scandir($path) | Gibt ein array mit allen Einträgen eines Verzeichnisses zurück (einschließlich . und ..). |
opendir() / readdir() / closedir() | Öffnet ein Verzeichnis-Handle und liest Einträge einzeln aus. |
getcwd() | Gibt das aktuelle Arbeitsverzeichnis zurück. |
chdir($path) | Wechselt das aktuelle Arbeitsverzeichnis. |
scandir() vs. opendir()
Beide listen den Inhalt eines Verzeichnisses auf, eignen sich jedoch für unterschiedliche Anforderungen:
scandir()lädt alle Einträge auf einmal in ein array. Es ist prägnant und einfach zu sortieren, verbraucht jedoch Speicher proportional zur Anzahl der Dateien. Am besten für kleine bis mittelgroße Ordner geeignet.opendir()/readdir()liefert Einträge einzeln. Dies hält den Speicherbedarf konstant, selbst bei Verzeichnissen mit zehntausenden Dateien. Am besten für sehr große Ordner geeignet.
Beide enthalten die speziellen Einträge . (aktuell) und .. (übergeordnet) — die Sie fast immer überspringen möchten.
Beispiel: Verzeichnis erstellen und auflisten
Dieses Skript prüft, ob ein Verzeichnis existiert, erstellt es (zusammen mit fehlenden Elternordnern) falls nicht, und gibt dann seinen Inhalt aus:
<?php
$dir = 'uploads/images';
// Create the directory and any missing parents if it doesn't exist
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
echo "Directory created: $dir\n";
}
// List directory contents, skipping the . and .. entries
$files = scandir($dir);
echo "Contents of $dir:\n";
foreach ($files as $file) {
if ($file !== '.' && $file !== '..') {
echo "- $file\n";
}
}
?>Das dritte Argument von mkdir() (true) ist das recursive-Flag: Ohne es schlägt mkdir('uploads/images') fehl, wenn uploads noch nicht existiert. 0755 ist ein oktaler Berechtigungsmodus (Eigentümer kann lesen/schreiben/ausführen, andere können lesen/ausführen) und wird unter Windows ignoriert.
Beispiel: Streaming mit opendir()
Bei großen Verzeichnissen lesen Sie Einträge einzeln, anstatt ein vollständiges array aufzubauen:
<?php
$dir = __DIR__;
if ($handle = opendir($dir)) {
while (($entry = readdir($handle)) !== false) {
if ($entry !== '.' && $entry !== '..') {
$type = is_dir("$dir/$entry") ? 'dir ' : 'file';
echo "[$type] $entry\n";
}
}
closedir($handle);
}
?>Beachten Sie den strikten Vergleich !== false: Eine Datei mit dem Namen "0" ist falsy, sodass eine lose while ($entry = readdir(...)) Schleife zu früh stoppen würde. Vergleichen Sie stets explizit gegen false.
Verzeichnisse entfernen
rmdir() löscht nur ein leeres Verzeichnis. Um eines zu entfernen, das noch Dateien enthält, löschen Sie zunächst den Inhalt — typischerweise mit einer rekursiven Hilfsfunktion:
<?php
function removeDir(string $dir): void {
foreach (scandir($dir) as $entry) {
if ($entry === '.' || $entry === '..') {
continue;
}
$path = "$dir/$entry";
is_dir($path) ? removeDir($path) : unlink($path);
}
rmdir($dir);
}
?>Diese Funktion durchläuft jeden Eintrag, taucht rekursiv in Unterverzeichnisse ein und ruft unlink() auf Dateien auf, sodass das Verzeichnis leer ist, wenn rmdir() ausgeführt wird.
Häufige Fehlerquellen
mkdir()ohne das recursive-Flag schlägt fehl, wenn ein übergeordneter Ordner fehlt. Übergeben Sietruebeim Erstellen verschachtelter Pfade.- Berechtigungen werden durch
umaskreduziert — der tatsächliche Modus ist$mode & ~umask(), sodass0777als0755angewendet werden kann. rmdir()auf einem nicht leeren Ordner gibtfalsezurück und erzeugt eine Warnung. Leeren Sie ihn zuerst.scandir()enthält.und..— filtern Sie diese heraus, bevor Sie die Einträge verarbeiten.- Relative Pfade hängen von
getcwd()ab, also dem Arbeitsverzeichnis des Skripts, nicht dem Speicherort der Datei. Verwenden Sie__DIR__, um Pfade relativ zur aktuellen Datei zu verankern.
Verzeichnis-Workflow auf einen Blick
graph TD
A[Check Directory] --> B{Exists?}
B -->|No| C[mkdir]
B -->|Yes| D[scandir / opendir]
C --> E[Create Subdirectories]
D --> F[Read Entries]
F --> G[Process Files]
G --> H[close / rmdir]Zusammenfassung
PHPs Verzeichnisfunktionen bieten Ihnen eine portable, eingebaute Möglichkeit, Ordner zu verwalten: mkdir() und rmdir() erstellen und entfernen sie, is_dir() prüft sie, und scandir() oder opendir()/readdir() listen ihren Inhalt auf. Verwenden Sie scandir() für kleine Ordner wegen seiner Einfachheit und opendir()-Streaming für große Ordner, um den Speicherbedarf konstant zu halten. Kombinieren Sie diese mit PHP-Dateifunktionen und File Handling, um robuste Upload-, Cache- und Export-Funktionen zu erstellen.