is_writable()
PHP is_writable() devuelve true si un archivo o directorio tiene permisos de escritura. Aprende su sintaxis, advertencias y la caché de stat.
La función is_writable() de PHP te indica, antes de intentar escribir, si el proceso actual tiene permiso para escribir en un archivo o directorio dado. Esta página cubre su sintaxis, valor de retorno, el comportamiento de caché que suele confundir a los desarrolladores y los patrones prácticos para usarla de forma segura.
¿Qué es la función is_writable()?
is_writable() es una función integrada de PHP que devuelve true si el archivo (o directorio) indicado existe y es escribible por el usuario con el que se ejecuta el proceso PHP, y false en caso contrario. La función acepta un argumento y no realiza ninguna escritura por sí misma — solo informa sobre los permisos.
La comprobación se basa en el ID de usuario efectivo del proceso en ejecución (por ejemplo, www-data en Apache/Nginx-FPM), no en el usuario propietario del script. Un archivo que puedes editar en tu editor puede seguir siendo reportado como no escribible para el servidor web.
is_writable() tiene un alias, is_writeable() (con una e adicional); los dos son idénticos.
Sintaxis
is_writable(string $filename): bool| Parámetro | Descripción |
|---|---|
$filename | Ruta al archivo o directorio a comprobar. Puede ser relativa al directorio de trabajo actual. |
Devuelve true en caso de éxito, false si la ruta no es escribible o no existe.
Cómo usar la función is_writable()
El patrón típico es "mirar antes de saltar" — confirmar que un archivo es escribible antes de intentar abrirlo para escritura, para poder fallar con un mensaje claro en lugar de generar una advertencia en tiempo de ejecución.
Como el entorno de ejecución del sandbox crea data.txt, el ejemplo anterior imprime The file 'data.txt' is writable.
Un ejemplo completo y ejecutable
Este script independiente crea un archivo, lo comprueba y solo escribe cuando la verificación es exitosa:
<?php
$file = 'log.txt';
// Create the file so the example is reproducible.
file_put_contents($file, "first line\n");
if (is_writable($file)) {
file_put_contents($file, "second line\n", FILE_APPEND);
echo "Wrote to $file:\n";
echo file_get_contents($file);
} else {
echo "Cannot write to $file.";
}Salida:
Wrote to log.txt:
first line
second lineComprobar un directorio
is_writable() también funciona con directorios. Esta es la comprobación adecuada antes de crear un nuevo archivo: no puedes comprobar el archivo (aún no existe), así que compruebas la carpeta que lo contendrá.
<?php
$dir = __DIR__; // the directory this script lives in
if (is_writable($dir)) {
echo "New files can be created in: $dir";
} else {
echo "Directory is read-only: $dir";
}Problemas comunes
- No lanza excepciones — emite advertencias. Si
$filenamees inválido de una forma que PHP no puede resolver (p. ej., una violación de open_basedir), PHP puede emitir unE_WARNING. El valor de retorno sigue siendofalse. Usa@para suprimirlo solo como último recurso. - Los resultados pueden estar en caché. PHP mantiene una caché de stat. Si los permisos de un archivo cambian durante la misma ejecución del script,
is_writable()puede devolver un resultado desactualizado. Llama aclearstatcache()antes de volver a comprobar para forzar a PHP a leer el sistema de archivos de nuevo. falsees ambiguo. Un resultadofalsesignifica "no escribible o no existe." Si necesitas distinguir los dos casos, combínalo confile_exists().- Condición de carrera TOCTOU. Entre la comprobación con
is_writable()y la escritura real, los permisos del archivo podrían cambiar. Para código crítico, no te fíes solo de la comprobación — gestiona también el fallo de la escritura en sí.
Cuando cambias permisos a mitad de un script y vuelves a comprobar, limpia la caché primero:
<?php
$file = 'config.ini';
file_put_contents($file, "data\n");
var_dump(is_writable($file)); // bool(true)
chmod($file, 0444); // make it read-only
clearstatcache(); // force PHP to re-read the filesystem
var_dump(is_writable($file)); // bool(false)Salida:
bool(true)
bool(false)Funciones relacionadas
is_readable()— la contraparte para permisos de lectura.file_exists()— comprueba la existencia sin verificar permisos.is_file()— confirma que una ruta es un archivo regular.fopen()/fwrite()— abre y escribe en archivos una vez superada la comprobación.chmod()— cambia los bits de permisos de un archivo.
Conclusión
is_writable() permite que tu script confirme el acceso de escritura de antemano y falle de forma controlada en lugar de generar advertencias en tiempo de ejecución. Recuerda sus tres particularidades: refleja los permisos del usuario del proceso, false también significa "no existe," y sus resultados están en caché hasta que llames a clearstatcache(). Combínala con el manejo de errores de la escritura real para un código de archivos robusto.