Crear una carpeta en PHP si no existe: la evolución de una pregunta
Si alguna vez has escrito un script que sube archivos, guarda caché o genera informes, probablemente te hayas encontrado con la situación: "¡Pero la carpeta no existe!". Un error que detiene todo el script, dejando al usuario mirando una pantalla en blanco o (peor aún) un críptico error de PHP.
La pregunta "Crear una carpeta si ya no existe" en Stack Overflow acumula miles de visitas. Y con razón. Parece simple, ¿verdad? Pero el diablo, como siempre, está en los detalles: permisos, recursividad, manejo de excepciones, codificación de nombres de carpeta. En 2025, a medida que los proyectos se vuelven más complejos y los requisitos de seguridad más estrictos, la creación adecuada de directorios es una habilidad fundamental que todo desarrollador PHP debe conocer.
En este artículo, cubriremos 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 de producción con protección contra condiciones de carrera. ¡Vamos allá!
¿Por qué mkdir() simple es malo? (historia de un error)
Al principio, muchos escriben esto:
<?phpmkdir('/path/to/my/folder');?>Y obtienen:
- Warning: mkdir(): No such file or directory — si la carpeta padre no existe.
- Warning: mkdir(): File exists — si la carpeta ya existe.
Ambas advertencias no son solo "texto amarillo". En modo producción, pueden convertirse en errores fatales si el reporte de errores estricto está habilitado. También es un agujero de seguridad: un atacante podría crear una carpeta con el mismo nombre antes de que tu script lo haga (condición de carrera).
Por lo tanto, el enfoque moderno siempre implica verificación, recursividad y control de permisos.
Método 1: Clásico con is_dir() y mkdir() (para principiantes)
La forma más simple y comprensible es primero verificar si la carpeta existe, y luego crearla.
<?php$folder = '/var/www/uploads/images';
if (!is_dir($folder)) { mkdir($folder, 0755, true); echo "¡Carpeta creada!";} else { echo "La carpeta ya existe.";}?>Lo importante aquí:
is_dir()— devuelve verdadero si la ruta existe y es un directorio.mkdir($folder, 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→ creauploads, luegoimages).0755— permisos: el propietario puede hacer todo, otros pueden leer y ejecutar.
Inconveniente: este código no está protegido contra condiciones de carrera. Si dos solicitudes verifican simultáneamente is_dir() y ambas intentan crear la carpeta, la segunda generará una advertencia.
Método 2: Enfoque de producción con @mkdir() y verificación de errores
Los desarrolladores experimentados a menudo usan el operador de supresión de errores @ y luego verifican explícitamente el resultado.
<?php$folder = '/var/www/uploads/images';
if (!is_dir($folder)) { // Suprime la advertencia si la carpeta ya existe if (!@mkdir($folder, 0755, true) && !is_dir($folder)) { throw new \\RuntimeException('Error al crear la carpeta: ' . $folder); }}?>¿Por qué es mejor?
- Suprimimos la advertencia pero no ignoramos el error — si la creación falla, se lanza una excepción.
- La doble verificación
!is_dir($folder)después demkdir()protege contra condiciones de carrera: si otro proceso creó la carpeta entre nuestra verificación y la llamada amkdir(), no fallaremos.
Nota: El operador @ reduce el rendimiento porque PHP aún genera el error pero lo oculta. En proyectos de alta carga, es mejor usar el método 3.