fileowner()
La función fileowner() de PHP devuelve el propietario de un archivo como ID de usuario numérico. Aprende su sintaxis, valores de retorno y uso correcto.
La función fileowner() es una función integrada de PHP que devuelve el propietario de un archivo como un ID de usuario (UID) numérico — el mismo UID que el sistema operativo almacena en los metadatos del archivo. Es el equivalente en PHP de observar la columna de propietario en ls -l. Esta página explica la sintaxis, los valores de retorno, el problema común de los resultados en caché obsoletos y cómo convertir el UID numérico en un nombre de usuario legible.
Sintaxis
fileowner(string $filename): int|false$filename— la ruta al archivo (o directorio) a inspeccionar. Puede ser relativa o absoluta.- Devuelve el ID de usuario del propietario como un
inten caso de éxito, ofalseen caso de error (por ejemplo, si el archivo no existe o el script no tiene permiso para leer sus metadatos).
Dado que un UID válido puede ser 0 (el usuario root en sistemas Unix), compara siempre el resultado con el operador estricto === false en lugar de una verificación de veracidad flexible — de lo contrario, un archivo propiedad de root perfectamente válido parecería un error.
Ejemplo básico
<?php
$filename = __FILE__; // inspect the running script itself
$owner_id = fileowner($filename);
if ($owner_id === false) {
echo "Failed to get the owner of the file.";
} else {
echo "The owner of '$filename' has user ID $owner_id.";
}Una posible salida es:
The owner of '/var/www/example.php' has user ID 33.El número exacto depende de qué cuenta del sistema operativo creó o es propietaria del archivo (por ejemplo, 33 es el usuario predeterminado www-data en muchos sistemas Debian/Ubuntu).
Convertir el UID en un nombre de usuario
Un número sin contexto rara vez es lo que se quiere mostrar a un usuario. En sistemas similares a Unix con la extensión POSIX habilitada, pasa el UID a posix_getpwuid() para buscar los detalles de la cuenta:
<?php
$uid = fileowner(__FILE__);
if ($uid !== false && function_exists('posix_getpwuid')) {
$info = posix_getpwuid($uid);
echo "Owner: {$info['name']} (UID {$uid})";
} else {
echo "Owner UID: " . var_export($uid, true);
}Esto imprime algo como Owner: www-data (UID 33). La extensión POSIX no está disponible en Windows, así que protege la llamada con function_exists() como se muestra.
Cuidado con los resultados en caché
PHP almacena en caché los resultados de las funciones basadas en stat (fileowner(), fileperms(), filegroup(), filesize() y similares) por motivos de rendimiento. Si el propietario del archivo cambia durante la misma ejecución del script — por ejemplo, después de llamar a chown() — fileowner() puede devolver el valor antiguo. Limpia primero la caché con clearstatcache():
<?php
$file = 'report.txt';
chown($file, 'nobody'); // change ownership
clearstatcache(); // discard the stale stat cache
$uid = fileowner($file); // now reflects the new ownerNotas y consideraciones
- Windows: el concepto de propietario POSIX numérico no se corresponde bien con las ACL de Windows.
fileowner()normalmente devuelve0, así que no dependas de ello para la lógica de permisos en Windows. falsevs.0:0esroot(un propietario real);falsesignifica que la llamada falló. Usa===.- ¿Necesitas más que el propietario?
stat()devuelve el array completo de metadatos (tamaño, modo, propietario, grupo, marcas de tiempo) en una sola llamada, lo cual es más eficiente que llamar a varias funcionesfile*()por separado. - Verifica el acceso primero: si solo necesitas saber si puedes leer un archivo,
is_readable()es la herramienta adecuada —fileowner()responde una pregunta diferente.
Conclusión
fileowner() es una función pequeña pero útil para leer el propietario numérico de un archivo en PHP. Compara su resultado con === false, recuerda que 0 es un propietario válido (root), llama a clearstatcache() después de cambiar la propiedad, y usa posix_getpwuid() cuando necesites el nombre de usuario legible. En Windows su resultado no es significativo, así que reserva la lógica basada en propietarios para sistemas similares a Unix.