W3docs

is_writeable()

La función is_writable() de PHP comprueba si un archivo o directorio tiene permisos de escritura. Devuelve true si es escribible, y false en caso contrario.

Qué hace la función is_writable()

La función is_writable() es una función integrada de PHP que comprueba si una ruta dada existe y puede ser escrita por el proceso actual. Funciona tanto para archivos como para directorios. Devuelve true cuando la ruta existe y es escribible, y false en caso contrario, incluido cuando la ruta no existe en absoluto.

Esta página cubre la sintaxis, el valor de retorno, los usos más comunes en el mundo real y los problemas frecuentes (caché, enlaces simbólicos, root y la ortografía obsoleta is_writeable()) que suelen confundir a los desarrolladores.

is_writeable() vs is_writable()

is_writeable() (con la e extra) es un alias antiguo de is_writable(). Fue declarado obsoleto en PHP 5.0.0 y eliminado en PHP 8.0.0, donde al llamarlo ahora se produce un Error fatal. Usa siempre la ortografía canónica is_writable() en código moderno.

Sintaxis

is_writable(string $filename): bool
ParámetroDescripción
$filenameLa ruta al archivo o directorio a comprobar. Puede ser relativa (resuelta respecto al directorio de trabajo actual) o absoluta.

Valor de retorno: true si $filename existe y es escribible; de lo contrario, false. Una ruta inexistente devuelve false en lugar de lanzar un error.

Ejemplo básico

php— editable, runs on the server

La función devuelve un boolean, por lo que encaja directamente en una condición if. Aquí el mensaje depende de si el proceso que ejecuta el script tiene permiso de escritura sobre /path/to/file.

Un patrón de escritura seguro

El uso más habitual es proteger una escritura para que el script falle de forma controlada en lugar de fallar con una advertencia de permisos:

<?php

$logFile = __DIR__ . '/app.log';

if (is_writable($logFile)) {
    file_put_contents($logFile, "Started at " . date('c') . "\n", FILE_APPEND);
    echo "Log entry written.";
} else {
    echo "Cannot write to $logFile — check permissions.";
}

Ten en cuenta que is_writable() comprueba una ruta existente. Si el archivo aún no existe, normalmente querrás comprobar el directorio que lo contendrá, porque crear un archivo nuevo requiere permiso de escritura en el directorio padre:

<?php

$target = __DIR__ . '/cache/data.json';

if (is_writable(dirname($target))) {
    file_put_contents($target, '{}');
    echo "File created.";
} else {
    echo "The cache directory is not writable.";
}

Aspectos a tener en cuenta

  • Los resultados se almacenan en caché. PHP almacena en caché los metadatos del sistema de archivos mediante la stat cache. Si cambias los permisos durante un script (por ejemplo con chmod()) y vuelves a comprobar la misma ruta, llama primero a clearstatcache() para obtener un resultado actualizado.
  • Comprueba el propietario del proceso, no tu sesión. Una ruta que es escribible en tu terminal puede no serlo para el usuario del servidor web (www-data, nginx, etc.) que realmente ejecuta PHP.
  • Ejecución como root. El superusuario puede escribir casi en cualquier lugar, por lo que is_writable() puede devolver true incluso en archivos marcados como de solo lectura. No confíes en esta función como frontera de seguridad.
  • Los enlaces simbólicos se siguen. La comprobación se aplica al destino de un enlace simbólico, no al propio enlace.
  • Condiciones de carrera (TOCTOU). Una ruta puede volverse no escribible entre la comprobación y la escritura real. Para escrituras críticas, intenta la escritura y gestiona el fallo en lugar de depender solo de la comprobación.
<?php

chmod('/tmp/example.txt', 0644);
var_dump(is_writable('/tmp/example.txt')); // may show stale value
clearstatcache();                          // refresh the stat cache
var_dump(is_writable('/tmp/example.txt')); // now reflects the new permissions

Funciones relacionadas

Conclusión

is_writable() te permite comprobar, antes de escribir, si un archivo o directorio puede ser escrito por el proceso actual, devolviendo false para rutas inexistentes en lugar de lanzar una excepción. Recuerda comprobar el directorio padre al crear archivos nuevos, llamar a clearstatcache() tras cambiar permisos durante el script, y usar la ortografía canónica ya que is_writeable() fue eliminada en PHP 8.

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?