W3docs

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ámetroDescripción
$filenameRuta 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.

php— editable, runs on the server

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 line

Comprobar 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 $filename es inválido de una forma que PHP no puede resolver (p. ej., una violación de open_basedir), PHP puede emitir un E_WARNING. El valor de retorno sigue siendo false. 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 a clearstatcache() antes de volver a comprobar para forzar a PHP a leer el sistema de archivos de nuevo.
  • false es ambiguo. Un resultado false significa "no escribible o no existe." Si necesitas distinguir los dos casos, combínalo con file_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.

Práctica

Práctica
¿Qué hace la función is_writable() en PHP?
¿Qué hace la función is_writable() en PHP?
Was this page helpful?