Créer un dossier en PHP s'il n'existe pas : l'évolution d'une question
\n\nSi 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\nLa 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\nDans 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\nPourquoi un simple mkdir() est mauvais ? (histoire d'une erreur)
\n\nAu début, beaucoup écrivent ceci :
\n\n<?php\nmkdir('/path/to/my/folder');\n?>\n\nEt 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
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\nC'est pourquoi l'approche moderne consiste toujours à vérifier, à utiliser la récursivité et à contrôler les droits.
\n\nMéthode 1 : La classique avec is_dir() et mkdir() (pour débutants)
\n\nLa 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\nCe 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ètretrueactive la création récursive. Si le dossier parent n'existe pas, PHP créera toute la chaîne (/var/www/uploads/images→ créerauploads, puisimages). \n 0755— droits d'accès : le propriétaire peut tout faire, les autres peuvent lire et exécuter. \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.
Méthode 2 : Approche industrielle avec @mkdir() et vérification des erreurs
\n\nLes développeurs expérimentés utilisent souvent l'opérateur de suppression d'erreurs @ puis vérifient explicitement le résultat.
<?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\nPourquoi 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èsmkdir()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
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.