« Create a folder if it doesn't already exist » : Comment ne pas réinventer la roue en 2025
\n\nAvez-vous déjà écrit un script qui doit enregistrer des fichiers et soudainement obtenu l'erreur Warning: mkdir(): No such file or directory ? Si oui, vous n'êtes pas seul. La question « Create a folder if it doesn't already exist » sur Stack Overflow a rassemblé des milliers de vues, et ce n'est pas pour rien. Cela semble simple, non ? Mais en pratique, les débutants (et pas seulement) trébuchent souvent sur des pièges : droits d'accès, création récursive, conditions de concurrence.
Dans cet article, nous allons examiner les meilleures pratiques PHP pour créer des dossiers en 2025. Vous apprendrez à utiliser correctement mkdir(), à éviter les erreurs typiques et à écrire un code fiable qui ne plantera pas au pire moment. C'est parti !
Pourquoi la question « Create a folder if it doesn't exist » est-elle si populaire ?
\n\nUn projet web sur deux travaille d'une manière ou d'une autre avec des fichiers : téléchargement d'avatars, génération de rapports, mise en cache, journaux. Et partout, il faut s'assurer que le répertoire cible existe. S'il n'existe pas, le script générera une erreur, l'utilisateur verra une « 500 Internal Server Error », et vous chercherez le bug à trois heures du matin.
\n\nLe problème est que la fonction PHP mkdir() ne crée pas automatiquement un dossier si le répertoire parent est absent. De nombreux développeurs écrivent quelque chose comme :
if (!file_exists($path)) {\n mkdir($path);\n}\n\n\nEt cela fonctionne… jusqu'à ce qu'une race condition (condition de concurrence) se produise. Si deux scripts vérifient simultanément l'existence du dossier et tentent tous deux de le créer, l'un d'eux plantera avec une erreur. En 2025, alors que la charge sur les sites web augmente, ces bugs deviennent critiques.
\n\nLa fonction mkdir() en PHP : analyse détaillée
\n\nRappelons sa signature :
\n\nmkdir(string $directory, int $permissions = 0777, bool $recursive = false, resource $context = ?): bool\n\n\n- \n
- $directory — chemin vers le dossier à créer. \n
- $permissions — droits d'accès (par défaut 0777, mais le masque umask s'applique). \n
- $recursive — si
true, crée tous les répertoires parents manquants. \n - $context — contexte de flux (rarement utilisé). \n
Le secret principal est le paramètre $recursive. La plupart des problèmes sont résolus grâce à lui. Mais procédons dans l'ordre.
Méthode simple : is_dir() + mkdir()
\n\nLa manière la plus évidente et correcte de vérifier si un dossier existe est d'utiliser is_dir(), et non file_exists(). Pourquoi ? Parce que file_exists() renverra true même pour un fichier portant ce nom, ce qui entraînera une erreur.
$dir = '/path/to/upload';\n\nif (!is_dir($dir)) {\n mkdir($dir, 0755, true);\n}\n\n\nIci, nous :
\n- \n
- Vérifions que le répertoire n'existe pas et n'est pas un fichier. \n
- Créons le dossier avec les droits 0755 (le propriétaire peut tout faire, les autres peuvent lire et exécuter). \n
- Utilisons
truepour la création récursive — si le dossier parent/path/ton'existe pas, il sera également créé. \n
Cette méthode couvre 90 % des cas. Mais que se passe-t-il si deux requêtes exécutent ce code simultanément ?
\n\nProtection contre la race condition (condition de concurrence)
\n\nDans les systèmes à forte charge, deux scripts peuvent tenter de créer le dossier en même temps. Pour éviter l'erreur, utilisez @ (suppression des erreurs) ou, mieux encore, vérifiez le résultat de mkdir() :
$dir = '/path/to/cache';\n\nif (!is_dir($dir)) {\n // On tente de créer. Si un autre processus a déjà créé le dossier, ce n'est pas grave\n if (!mkdir($dir, 0755, true) && !is_dir($dir)) {\n throw new \\RuntimeException('Impossible de créer le répertoire : ' . $dir);\n