Crear una carpeta en PHP si no existe: 5 mejores formas en 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

Crear una carpeta en PHP si no existe: evolución de una pregunta

\n\n

Si alguna vez has escrito un script que carga archivos, guarda caché o genera informes, seguramente te has encontrado con la situación: «¡La carpeta no existe!». Un error que derriba todo el script, y el usuario ve una pantalla en blanco o (peor aún) un error incomprensible de PHP.

\n\n

La pregunta «Create a folder if it doesn't already exist» en Stack Overflow acumula miles de visitas. Y no es para menos. Parece sencillo, ¿verdad? Pero el diablo, como siempre, está en los detalles: permisos de acceso, recursividad, manejo de excepciones, codificación del nombre de la carpeta. En 2025, cuando los proyectos son cada vez más complejos y los requisitos de seguridad más estrictos, la creación correcta de directorios es la base que todo desarrollador PHP debe conocer.

\n\n

En este artículo, analizaremos 5 mejores prácticas para crear una carpeta en PHP si no existe. Desde una solución simple para principiantes hasta código de nivel profesional con protección contra race condition. ¡Allá vamos!

\n\n

¿Por qué simplemente mkdir() es malo? (historia de un error)

\n\n

Al principio, muchos escriben así:

\n\n
<?php\nmkdir('/ruta/a/mi/carpeta');\n?>
\n\n

Y obtienen:

\n\n
    \n
  • Warning: mkdir(): No such file or directory — si la carpeta padre no existe.
  • \n
  • Warning: mkdir(): File exists — si la carpeta ya existe.
  • \n
\n\n

Ambas advertencias no son solo «texto amarillo». En modo producción, pueden convertirse en errores fatales si el modo de reporte de errores es estricto. Además, es un agujero de seguridad: un atacante podría crear una carpeta con el mismo nombre antes que tu script (race condition).

\n\n

Por lo tanto, el enfoque moderno es siempre verificar, usar recursividad y controlar los permisos.

\n\n

Método 1: Clásico con is_dir() y mkdir() (para principiantes)

\n\n

La forma más simple y clara es primero verificar si la carpeta existe y luego crearla.

\n\n
<?php\n$carpeta = '/var/www/uploads/images';\n\nif (!is_dir($carpeta)) {\n    mkdir($carpeta, 0755, true);\n    echo "¡Carpeta creada!";\n} else {\n    echo "La carpeta ya existe.";\n}\n?>
\n\n

Lo importante aquí:

\n
    \n
  • is_dir() — devuelve true si la ruta existe y es un directorio.
  • \n
  • mkdir($carpeta, 0755, true) — el tercer parámetro true habilita la creación recursiva. Si la carpeta padre no existe, PHP creará toda la cadena (/var/www/uploads/images → creará uploads, luego images).
  • \n
  • 0755 — permisos de acceso: el propietario puede hacer todo, los demás pueden leer y ejecutar.
  • \n
\n\n

Desventaja: este código no está protegido contra race condition. Si dos solicitudes verifican is_dir() al mismo tiempo y ambas intentan crear la carpeta, la segunda generará una advertencia.

\n\n

Método 2: Enfoque profesional con @mkdir() y verificación de errores

\n\n

Los desarrolladores experimentados suelen usar el operador de supresión de errores @ y luego verifican explícitamente el resultado.

\n\n
<?php\n$carpeta = '/var/www/uploads/images';\n\nif (!is_dir($carpeta)) {\n    // Suprimimos el warning si la carpeta ya existe\n    if (!@mkdir($carpeta, 0755, true) && !is_dir($carpeta)) {\n        throw new \\RuntimeException('No se pudo crear la carpeta: ' . $carpeta);\n    }\n}\n?>
\n\n

¿Por qué es mejor?

\n
    \n
  • Suprimimos el warning, pero no ignoramos el error — si no se puede crear, se lanza una excepción.
  • \n
  • La doble verificación !is_dir($carpeta) después de mkdir() protege contra race condition: si otro proceso creó la carpeta entre nuestra verificación y la llamada a mkdir(), no fallaremos.
  • \n
\n\n

Atención: el operador @ reduce el rendimiento, ya que PHP igual genera el error, pero lo oculta. En proyectos de alta carga, es mejor usar el método 3.

Blogs

Book Recommendations