Einen Ordner in PHP erstellen, wenn er nicht existiert: Die 5 besten Methoden im Jahr 2025

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einen Ordner in PHP erstellen, wenn er nicht existiert: Die Entwicklung einer Frage

\n\n

Wenn 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\n

Die 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\n

In 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\n

Warum ist einfaches mkdir() schlecht? (Die Geschichte eines Fehlers)

\n\n

Am Anfang schreiben viele so:

\n\n
<?php\nmkdir('/pfad/zu/meinem/ordner');\n?>
\n\n

Und 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
\n\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\n

Daher ist der moderne Ansatz immer: Prüfung, Rekursion und Rechtekontrolle.

\n\n

Methode 1: Klassiker mit is_dir() und mkdir() (für Anfänger)

\n\n

Der 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\n

Was 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 Parameter true aktiviert die rekursive Erstellung. Wenn der übergeordnete Ordner nicht existiert, erstellt PHP die gesamte Kette (/var/www/uploads/images → erstellt uploads, dann images).
  • \n
  • 0755 – Zugriffsrechte: Der Besitzer darf alles, andere dürfen lesen und ausführen.
  • \n
\n\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.

\n\n

Methode 2: Industrieller Ansatz mit @mkdir() und Fehlerprüfung

\n\n

Erfahrene Entwickler verwenden oft den Fehlerunterdrückungsoperator @ und prüfen dann explizit das Ergebnis.

\n\n
<?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\n

Warum 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) nach mkdir() schützt vor Race Conditions: Wenn ein anderer Prozess den Ordner zwischen unserer Prüfung und dem Aufruf von mkdir() erstellt hat, stürzen wir nicht ab.
  • \n
\n\n

Achtung: Der Operator @ verringert die Leistung, da PHP den Fehler trotzdem generiert, ihn aber versteckt. In hochbelasteten Projekten ist Methode 3 besser geeignet.

Blogs

Buchempfehlungen