stat()
En PHP, la función stat() se usa para obtener información sobre un archivo. Aprende su sintaxis, valores de retorno y ejemplos prácticos.
Introducción
La función stat() devuelve un array con metadatos de bajo nivel sobre un archivo: su tamaño, permisos, propietario, inodo, número de enlaces y tres marcas de tiempo (acceso, modificación y cambio de inodo). Es el envoltorio PHP sobre la llamada al sistema stat() de C, por lo que te proporciona en una sola llamada la misma información que de otro modo tendrías que obtener con múltiples funciones separadas como filesize(), filemtime() y fileperms().
Este artículo cubre la sintaxis, el significado completo de cada valor que devuelve stat(), los problemas comunes (la caché de stat, los enlaces simbólicos y los índices de cadena frente a los numéricos) y ejemplos ejecutables.
Sintaxis
stat(string $filename): array|false$filename— la ruta al archivo del que quieres información.- Valor de retorno — un array que describe el archivo, o
falsesi hay un fallo (por ejemplo, el archivo no existe o no se puede leer). Como puede devolverfalse, comprueba siempre el resultado antes de acceder a sus índices.
stat() sigue los enlaces simbólicos e informa sobre el archivo destino. Si necesitas los metadatos del propio enlace, usa lstat(). Para obtener el stat de un archivo para el que ya tienes un identificador abierto, usa fstat().
Qué devuelve stat()
El array devuelto es inusual: cada valor aparece dos veces — una bajo un índice numérico y otra bajo una clave de cadena descriptiva. Así, $info[7] e $info['size'] tienen el mismo valor. Este doble indexado existe por compatibilidad con versiones anteriores; se prefieren las claves con nombre para un código más legible.
| Numérico | Con nombre | Significado |
|---|---|---|
| 0 | dev | Número de dispositivo |
| 1 | ino | Número de inodo |
| 2 | mode | Bits de permisos y tipo de archivo (ver más abajo) |
| 3 | nlink | Número de enlaces duros |
| 4 | uid | ID de usuario del propietario |
| 5 | gid | ID de grupo del propietario |
| 6 | rdev | Tipo de dispositivo, si el archivo es un dispositivo (-1 en Windows) |
| 7 | size | Tamaño en bytes |
| 8 | atime | Último tiempo de acceso (marca de tiempo Unix) |
| 9 | mtime | Último tiempo de modificación (marca de tiempo Unix) |
| 10 | ctime | Último tiempo de cambio de inodo (marca de tiempo Unix) |
| 11 | blksize | Tamaño del bloque de E/S del sistema de archivos (-1 en Windows) |
| 12 | blocks | Número de bloques de 512 bytes asignados (-1 en Windows) |
Algunas notas:
modecombina el tipo de archivo y los bits de permisos. Para obtener solo los bits de permisos Unix (como0644), aplica la máscara& 0777; para mostrarlos en octal, envuélvelos condecoct().ctimees el tiempo de cambio de inodo (cuando los permisos, la propiedad o los enlaces cambiaron por última vez) — no es la hora de creación del archivo. La mayoría de los sistemas de archivos Unix no almacenan una hora de creación.- Los valores
rdev,blksizeyblocksno tienen significado en Windows.
Ejemplo: Leer los Metadatos de un Archivo
Este ejemplo crea un archivo temporal, obtiene su stat y muestra el tamaño, los permisos y la hora de modificación:
<?php
// Create a small file to inspect.
$path = tempnam(sys_get_temp_dir(), 'demo');
file_put_contents($path, "Hello, stat()!");
$info = stat($path);
if ($info === false) {
echo "Could not stat the file.";
exit;
}
echo "Size: {$info['size']} bytes\n";
echo "Permissions: " . decoct($info['mode'] & 0777) . "\n";
echo "Modified: " . date('Y-m-d H:i:s', $info['mtime']) . "\n";
unlink($path); // clean upSalida (los permisos y la hora exactos dependen de tu sistema):
Size: 14 bytes
Permissions: 600
Modified: 2026-06-21 12:00:00Protégete siempre contra false: pasar una ruta inexistente produce una advertencia y false, e indexar false de otro modo lanzaría un error.
Precaución: la Caché de Stat
Por rendimiento, PHP almacena en caché los resultados de stat() y las funciones de archivo relacionadas. Si un archivo cambia durante la misma ejecución del script y lo vuelves a analizar, puedes obtener datos obsoletos. Limpia la caché con clearstatcache() antes de volver a leer:
<?php
$path = tempnam(sys_get_temp_dir(), 'demo');
file_put_contents($path, "first");
echo stat($path)['size'], "\n"; // 5
file_put_contents($path, "much longer content");
clearstatcache(true, $path); // refresh cached metadata
echo stat($path)['size'], "\n"; // 19
unlink($path);stat() frente a las Funciones de Propósito Único
Si solo necesitas una pieza de información, las funciones dedicadas son más claras y ligeramente más eficientes:
- Tamaño de archivo →
filesize() - Tiempo de modificación →
filemtime() - Último tiempo de acceso →
fileatime() - Permisos →
fileperms() - Tipo de archivo →
filetype()
Recurre a stat() cuando necesites varios de estos a la vez, ya que realiza una única llamada al sistema en lugar de muchas. Antes de analizar el stat, también puedes verificar que la ruta es un archivo real con is_file() o file_exists().
Conclusión
La función stat() te proporciona una instantánea completa de bajo nivel de los metadatos de un archivo en una sola llamada. Recuerda comprobar si hay un retorno false, usar las claves de array con nombre para mayor legibilidad, aplicar la máscara mode con & 0777 para los permisos y limpiar la caché de stat si vuelves a leer un archivo que cambió durante la ejecución del script. Cuando solo necesites un atributo, prefiere la función de propósito único correspondiente.