«Create a folder if it doesn't already exist»: Cómo no reinventar la rueda en 2025
\n\n¿Alguna vez has escrito un script que debía guardar archivos y de repente te encontraste con el error Warning: mkdir(): No such file or directory? Si es así, no estás solo. La pregunta «Create a folder if it doesn't already exist» en Stack Overflow acumula miles de visitas, y con razón. Parece algo sencillo, pero en la práctica, tanto principiantes como expertos tropiezan con obstáculos como permisos, creación recursiva y condiciones de carrera.
En este artículo, analizaremos las mejores prácticas de PHP para crear carpetas en 2025. Aprenderás a usar correctamente mkdir(), evitar errores comunes y escribir código robusto que no falle en el peor momento. ¡Vamos allá!
¿Por qué la pregunta «Create a folder if it doesn't exist» es tan popular?
\n\nPrácticamente todo proyecto web trabaja con archivos: subida de avatares, generación de informes, caché, logs. En todos los casos, hay que asegurarse de que el directorio de destino exista. Si no existe, el script lanzará un error, el usuario verá un «500 Internal Server Error» y tú estarás buscando el bug a las tres de la madrugada.
\n\nEl problema es que la función mkdir() de PHP no crea la carpeta automáticamente si el directorio padre no existe. Muchos desarrolladores escriben algo como:
if (!file_exists($path)) {\n mkdir($path);\n}\n\n\nY esto funciona… hasta que ocurre una race condition (condición de carrera). Si dos scripts verifican la existencia de la carpeta al mismo tiempo y ambos intentan crearla, uno fallará con un error. En 2025, con el aumento de la carga en los sitios web, estos errores se vuelven críticos.
\n\nLa función mkdir() en PHP: análisis detallado
\n\nRecordemos su sintaxis:
\n\nmkdir(string $directory, int $permissions = 0777, bool $recursive = false, resource $context = ?): bool\n\n\n- \n
- $directory — ruta de la carpeta a crear. \n
- $permissions — permisos de acceso (por defecto 0777, pero se aplica la máscara umask). \n
- $recursive — si es
true, crea todos los directorios padre que falten. \n - $context — contexto de flujo (se usa raramente). \n
El secreto está en el parámetro $recursive. La mayoría de los problemas se resuelven con él. Pero vayamos paso a paso.
Método simple: is_dir() + mkdir()
\n\nLa forma más obvia y correcta de verificar si una carpeta existe es usar is_dir(), no file_exists(). ¿Por qué? Porque file_exists() devolverá true incluso si existe un archivo con ese nombre, lo que provocaría un error.
$dir = '/ruta/a/upload';\n\nif (!is_dir($dir)) {\n mkdir($dir, 0755, true);\n}\n\n\nAquí:
\n- \n
- Verificamos que el directorio no exista ni sea un archivo. \n
- Creamos la carpeta con permisos 0755 (el propietario tiene todos los permisos; los demás, solo lectura y ejecución). \n
- Usamos
truepara la creación recursiva: si la carpeta padre/ruta/ano existe, también se creará. \n
Este método cubre el 90% de los casos. Pero, ¿qué pasa si dos solicitudes ejecutan este código al mismo tiempo?
\n\nProtección contra race condition (condición de carrera)
\n\nEn sistemas de alta concurrencia, dos scripts pueden intentar crear la misma carpeta simultáneamente. Para evitar errores, usa @ (supresión de errores) o, mejor aún, verifica el resultado de mkdir():
$dir = '/ruta/a/cache';\n\nif (!is_dir($dir)) {\n // Intentamos crear. Si otro proceso ya la creó, no pasa nada\n if (!mkdir($dir, 0755, true) && !is_dir($dir)) {\n throw new \\RuntimeException('No se pudo crear el directorio: ' . $dir);\n }\n}\n\n\nEste enfoque es más seguro: si mkdir() falla porque otro proceso ya creó la carpeta, la segunda condición (!is_dir($dir)) será falsa y no se lanzará la excepción. Así evitas errores innecesarios.
Manejo de permisos: el detalle que marca la diferencia
\n\nLos permisos por defecto de mkdir() son 0777, pero el valor real se ve afectado por la máscara umask del sistema. Para mayor control, establece los permisos explícitamente (por ejemplo, 0755) y, si es necesario, ajústalos después con chmod().
$dir = '/ruta/a/logs';\n\nif (!is_dir($dir)) {\n mkdir($dir, 0755, true);\n // Opcional: forzar permisos específicos\n chmod($dir, 0755);\n}\n\n\nConclusión: escribe código a prueba de balas
\n\nCrear una carpeta en PHP si no existe es una tarea común, pero los detalles marcan la diferencia entre un código frágil y uno robusto. Recuerda:
\n- \n
- Usa
is_dir()en lugar defile_exists(). \n - Activa el modo recursivo con
trueenmkdir(). \n - Protege tu código contra condiciones de carrera. \n
- Define permisos explícitos para evitar sorpresas. \n
Con estas prácticas, tus scripts de PHP serán más estables y profesionales. ¡Ponlas en marcha hoy mismo!