Crear una carpeta en PHP si no existe: evolución de una pregunta
\n\nSi 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\nLa 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\nEn 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\nAl principio, muchos escriben así:
\n\n<?php\nmkdir('/ruta/a/mi/carpeta');\n?>\n\nY 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
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\nPor lo tanto, el enfoque moderno es siempre verificar, usar recursividad y controlar los permisos.
\n\nMétodo 1: Clásico con is_dir() y mkdir() (para principiantes)
\n\nLa 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\nLo importante aquí:
\n- \n
is_dir()— devuelve true si la ruta existe y es un directorio. \n mkdir($carpeta, 0755, true)— el tercer parámetrotruehabilita la creación recursiva. Si la carpeta padre no existe, PHP creará toda la cadena (/var/www/uploads/images→ crearáuploads, luegoimages). \n 0755— permisos de acceso: el propietario puede hacer todo, los demás pueden leer y ejecutar. \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.
Método 2: Enfoque profesional con @mkdir() y verificación de errores
\n\nLos desarrolladores experimentados suelen usar el operador de supresión de errores @ y luego verifican explícitamente el resultado.
<?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 demkdir()protege contra race condition: si otro proceso creó la carpeta entre nuestra verificación y la llamada amkdir(), no fallaremos. \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.