is_readable()
La función is_readable() de PHP verifica si un archivo es legible y devuelve true si se puede leer o false en caso contrario.
La función is_readable() te indica si PHP puede leer un archivo o directorio determinado antes de intentar abrirlo. Comprueba que la ruta existe y que el proceso actual tiene permiso de lectura sobre ella. Llamarla primero te permite manejar los errores con elegancia en lugar de generar una advertencia en tiempo de ejecución desde fopen() o file_get_contents().
Este capítulo cubre la sintaxis, el valor de retorno, un ejemplo ejecutable, los problemas más comunes (caché, permisos, condiciones de carrera) y cómo is_readable() se relaciona con las demás funciones del sistema de archivos de PHP.
Sintaxis
is_readable(string $filename): bool| Parte | Significado |
|---|---|
$filename | Ruta al archivo o directorio a verificar. Puede ser absoluta (/var/www/data.txt) o relativa al directorio de trabajo del script. |
| Retorna | true si la ruta existe y es legible por el usuario/proceso actual, false en caso contrario. |
is_readable() también funciona con directorios: devuelve true cuando el directorio puede abrirse y listarse.
Ejemplo básico
La función devuelve un booleano, por lo que encaja de forma natural dentro de una condición if: se bifurca según si el archivo puede leerse sin necesidad de abrirlo.
Un ejemplo autocontenido y ejecutable
El ejemplo anterior apunta a una ruta que puede no existir. Aquí hay una versión que puedes ejecutar en cualquier lugar: crea un archivo, lo verifica y luego verifica una ruta que no existe:
<?php
// Create a temp file we know is readable.
$file = tempnam(sys_get_temp_dir(), 'demo');
file_put_contents($file, 'hello');
var_dump(is_readable($file)); // bool(true)
var_dump(is_readable('/no/such/file')); // bool(false)
unlink($file); // clean upLa primera llamada devuelve true porque el archivo existe y lo acabamos de crear con nuestros propios permisos; la segunda devuelve false porque la ruta no existe en absoluto.
Proteger una lectura de archivo
El uso típico en el mundo real es como guardia antes de leer, para que un archivo faltante o ilegible no emita una advertencia:
<?php
$path = 'config.json';
if (!is_readable($path)) {
// Handle the problem your way: log, default, or throw.
throw new RuntimeException("Cannot read config file: $path");
}
$config = json_decode(file_get_contents($path), true);Problemas comunes
- Los resultados se almacenan en caché. PHP almacena en caché la información de estado por solicitud. Si cambias los permisos de un archivo durante la misma ejecución del script, llama a
clearstatcache()antes de volver a verificar, o podrías obtener una respuesta obsoleta. trueno es una garantía. Los permisos pueden cambiar entre la comprobación y la lectura real (una condición de carrera time-of-check to time-of-use). Para código crítico, intenta directamente la lectura y maneja el error, en lugar de depender únicamente deis_readable().- Devuelve
falsepara rutas inexistentes — sin emitir advertencias. Así queis_readable()sirve también como verificación de "¿existe esto y puedo leerlo?". Para comprobar la existencia independientemente de los permisos, usafile_exists(). - Los permisos se evalúan para el usuario del servidor web (frecuentemente
www-data), no para tu usuario de shell, cuando el script se ejecuta bajo un servidor web.
Funciones relacionadas
is_writable()— el equivalente para permisos de escritura.is_file()— verifica que la ruta es un archivo regular (no un directorio).file_exists()— comprueba la existencia, ignorando el permiso de lectura.fopen()yfile_get_contents()— las funciones que normalmente se protegen conis_readable().
Conclusión
is_readable() es una forma ligera y sin efectos secundarios de verificar que una ruta existe y puede leerse antes de abrirla. Úsala como guardia para manejar errores con elegancia, recuerda que sus resultados se almacenan en caché dentro de una solicitud, y para código crítico de seguridad intenta la lectura y maneja los errores en lugar de confiar únicamente en la comprobación.