Créer un dossier en PHP s'il n'existe pas : 5 meilleures méthodes en 2025

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Créer un dossier en PHP s'il n'existe pas : l'évolution d'une question

\n\n

Si vous avez déjà écrit un script qui télécharge des fichiers, sauvegarde un cache ou génère des rapports, vous avez sûrement été confronté à cette situation : « Mais le dossier n'existe pas ! ». Une erreur qui fait planter tout le script, et l'utilisateur voit un écran blanc ou (pire encore) une erreur PHP incompréhensible.

\n\n

La question « Create a folder if it doesn't already exist » sur Stack Overflow recueille des milliers de vues. Et ce n'est pas sans raison. Quoi de plus simple, apparemment ? Mais le diable se cache, comme toujours, dans les détails : droits d'accès, récursivité, gestion des exceptions, encodage du nom du dossier. En 2025, alors que les projets deviennent de plus en plus complexes et les exigences de sécurité plus strictes, la création correcte de répertoires est une base que tout développeur PHP doit connaître.

\n\n

Dans cet article, nous allons examiner 5 meilleures pratiques pour créer un dossier en PHP s'il n'existe pas. De la solution simple pour débutants au code industriel avec protection contre les race conditions. C'est parti !

\n\n

Pourquoi un simple mkdir() est mauvais ? (histoire d'une erreur)

\n\n

Au début, beaucoup écrivent ceci :

\n\n
<?php\nmkdir('/path/to/my/folder');\n?>
\n\n

Et ils obtiennent :

\n\n
    \n
  • Warning: mkdir(): No such file or directory — si le dossier parent n'existe pas.
  • \n
  • Warning: mkdir(): File exists — si le dossier existe déjà.
  • \n
\n\n

Ces deux avertissements ne sont pas simplement du « texte jaune ». En mode production, ils peuvent se transformer en erreurs fatales si le mode de rapport d'erreurs strict est activé. C'est aussi une faille de sécurité : un attaquant peut créer un dossier avec le même nom avant votre script (race condition).

\n\n

C'est pourquoi l'approche moderne consiste toujours à vérifier, à utiliser la récursivité et à contrôler les droits.

\n\n

Méthode 1 : La classique avec is_dir() et mkdir() (pour débutants)

\n\n

La méthode la plus simple et la plus compréhensible consiste d'abord à vérifier si le dossier existe, puis à le créer.

\n\n
<?php\n$folder = '/var/www/uploads/images';\n\nif (!is_dir($folder)) {\n    mkdir($folder, 0755, true);\n    echo "Dossier créé !";\n} else {\n    echo "Le dossier existe déjà.";\n}\n?>
\n\n

Ce qui est important ici :

\n
    \n
  • is_dir() — retourne true si le chemin existe et est un répertoire.
  • \n
  • mkdir($folder, 0755, true) — le troisième paramètre true active la création récursive. Si le dossier parent n'existe pas, PHP créera toute la chaîne (/var/www/uploads/images → créera uploads, puis images).
  • \n
  • 0755 — droits d'accès : le propriétaire peut tout faire, les autres peuvent lire et exécuter.
  • \n
\n\n

Inconvénient : ce code n'est pas protégé contre les race conditions. Si deux requêtes vérifient simultanément is_dir() et tentent toutes deux de créer le dossier, la seconde générera un avertissement.

\n\n

Méthode 2 : Approche industrielle avec @mkdir() et vérification des erreurs

\n\n

Les développeurs expérimentés utilisent souvent l'opérateur de suppression d'erreurs @ puis vérifient explicitement le résultat.

\n\n
<?php\n$folder = '/var/www/uploads/images';\n\nif (!is_dir($folder)) {\n    // Supprime le warning si le dossier existe déjà\n    if (!@mkdir($folder, 0755, true) && !is_dir($folder)) {\n        throw new \\RuntimeException('Impossible de créer le dossier : ' . $folder);\n    }\n}\n?>
\n\n

Pourquoi c'est mieux ?

\n
    \n
  • Nous supprimons le warning, mais n'ignorons pas l'erreur — si la création échoue, une exception est levée.
  • \n
  • La double vérification !is_dir($folder) après mkdir() protège contre les race conditions : si un autre processus a créé le dossier entre notre vérification et l'appel à mkdir(), nous ne tombons pas en erreur.
  • \n
\n\n

Attention : l'opérateur @ réduit les performances, car PHP génère toujours l'erreur mais la masque. Dans les projets à forte charge, il est préférable d'utiliser la méthode 3.

Blogs

Book Recommendations