Crear carpeta en PHP si no existe: mejores prácticas 2025

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

«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.

\n\n

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á!

\n\n

¿Por qué la pregunta «Create a folder if it doesn't exist» es tan popular?

\n\n

Prá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\n

El 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:

\n\n
if (!file_exists($path)) {\n    mkdir($path);\n}\n
\n\n

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

La función mkdir() en PHP: análisis detallado

\n\n

Recordemos su sintaxis:

\n\n
mkdir(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
\n\n

El secreto está en el parámetro $recursive. La mayoría de los problemas se resuelven con él. Pero vayamos paso a paso.

\n\n

Método simple: is_dir() + mkdir()

\n\n

La 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.

\n\n
$dir = '/ruta/a/upload';\n\nif (!is_dir($dir)) {\n    mkdir($dir, 0755, true);\n}\n
\n\n

Aquí:

\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 true para la creación recursiva: si la carpeta padre /ruta/a no existe, también se creará.
  • \n
\n\n

Este método cubre el 90% de los casos. Pero, ¿qué pasa si dos solicitudes ejecutan este código al mismo tiempo?

\n\n

Protección contra race condition (condición de carrera)

\n\n

En 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():

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

Este 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.

\n\n

Manejo de permisos: el detalle que marca la diferencia

\n\n

Los 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().

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

Conclusión: escribe código a prueba de balas

\n\n

Crear 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 de file_exists().
  • \n
  • Activa el modo recursivo con true en mkdir().
  • \n
  • Protege tu código contra condiciones de carrera.
  • \n
  • Define permisos explícitos para evitar sorpresas.
  • \n
\n\n

Con estas prácticas, tus scripts de PHP serán más estables y profesionales. ¡Ponlas en marcha hoy mismo!

Blogs

Book Recommendations