Einen Ordner in PHP erstellen, wenn er nicht existiert: Die Entwicklung einer Frage
\n\nWenn Sie jemals ein Skript geschrieben haben, das Dateien hochlädt, einen Cache speichert oder Berichte generiert, sind Sie sicherlich auf die Situation gestoßen: "Den Ordner gibt es gar nicht!". Ein Fehler, der das gesamte Skript zum Absturz bringt, während der Benutzer einen weißen Bildschirm oder (noch schlimmer) eine kryptische PHP-Fehlermeldung sieht.
\n\nDie Frage "Create a folder if it doesn't already exist" auf Stack Overflow sammelt tausende von Aufrufen. Und das zu Recht. Was könnte schon schwierig daran sein? Aber der Teufel steckt, wie immer, im Detail: Zugriffsrechte, Rekursion, Ausnahmebehandlung, Kodierung des Ordnernamens. Im Jahr 2025, wenn Projekte immer komplexer und die Sicherheitsanforderungen strenger werden, ist die korrekte Erstellung von Verzeichnissen eine Grundlage, die jeder PHP-Entwickler kennen muss.
\n\nIn diesem Artikel werden wir 5 Best Practices zum Erstellen eines Ordners in PHP behandeln, falls er nicht existiert. Von einer einfachen Lösung für Anfänger bis hin zu produktionsreifem Code mit Schutz vor Race Conditions. Los geht's!
\n\nWarum ist einfaches mkdir() schlecht? (Die Geschichte eines Fehlers)
\n\nAm Anfang schreiben viele so:
\n\n<?php\nmkdir('/pfad/zu/meinem/ordner');\n?>\n\nUnd erhalten:
\n\n- \n
- Warning: mkdir(): No such file or directory – wenn der übergeordnete Ordner nicht existiert. \n
- Warning: mkdir(): File exists – wenn der Ordner bereits existiert. \n
Beide Warnungen sind nicht nur "gelber Text". Im Produktionsmodus können sie zu fatalen Fehlern werden, wenn der strenge Fehlerberichtsmodus aktiviert ist. Außerdem ist dies ein Sicherheitsloch: Ein Angreifer könnte vor Ihrem Skript einen Ordner mit demselben Namen erstellen (Race Condition).
\n\nDaher ist der moderne Ansatz immer: Prüfung, Rekursion und Rechtekontrolle.
\n\nMethode 1: Klassiker mit is_dir() und mkdir() (für Anfänger)
\n\nDer einfachste und verständlichste Weg ist, zuerst zu prüfen, ob der Ordner existiert, und ihn dann zu erstellen.
\n\n<?php\n$ordner = '/var/www/uploads/images';\n\nif (!is_dir($ordner)) {\n mkdir($ordner, 0755, true);\n echo "Ordner wurde erstellt!";\n} else {\n echo "Ordner existiert bereits.";\n}\n?>\n\nWas hier wichtig ist:
\n- \n
is_dir()– gibt true zurück, wenn der Pfad existiert und ein Verzeichnis ist. \n mkdir($ordner, 0755, true)– der dritte Parametertrueaktiviert die rekursive Erstellung. Wenn der übergeordnete Ordner nicht existiert, erstellt PHP die gesamte Kette (/var/www/uploads/images→ erstelltuploads, dannimages). \n 0755– Zugriffsrechte: Der Besitzer darf alles, andere dürfen lesen und ausführen. \n
Nachteil: Dieser Code ist nicht gegen Race Conditions geschützt. Wenn zwei Anfragen gleichzeitig is_dir() prüfen und beide versuchen, den Ordner zu erstellen, löst die zweite eine Warnung aus.
Methode 2: Industrieller Ansatz mit @mkdir() und Fehlerprüfung
\n\nErfahrene Entwickler verwenden oft den Fehlerunterdrückungsoperator @ und prüfen dann explizit das Ergebnis.
<?php\n$ordner = '/var/www/uploads/images';\n\nif (!is_dir($ordner)) {\n // Warning unterdrücken, falls der Ordner bereits existiert\n if (!@mkdir($ordner, 0755, true) && !is_dir($ordner)) {\n throw new \\RuntimeException('Ordner konnte nicht erstellt werden: ' . $ordner);\n }\n}\n?>\n\nWarum ist das besser?
\n- \n
- Wir unterdrücken die Warnung, ignorieren den Fehler aber nicht – wenn die Erstellung fehlschlägt, wird eine Exception ausgelöst. \n
- Die doppelte Prüfung
!is_dir($ordner)nachmkdir()schützt vor Race Conditions: Wenn ein anderer Prozess den Ordner zwischen unserer Prüfung und dem Aufruf vonmkdir()erstellt hat, stürzen wir nicht ab. \n
Achtung: Der Operator @ verringert die Leistung, da PHP den Fehler trotzdem generiert, ihn aber versteckt. In hochbelasteten Projekten ist Methode 3 besser geeignet.