lchown()
PHP lchown() cambia el propietario de un enlace simbólico sin seguirlo hasta el destino. Cubre sintaxis, valor de retorno y reglas de permisos.
La función lchown() de PHP cambia el propietario del propio enlace simbólico, sin seguir el enlace hasta su destino. Esta página explica qué hace, en qué se diferencia de chown(), la firma exacta y el valor de retorno, cuándo la necesitas realmente y las reglas de permisos que determinan si tiene éxito o falla.
¿Qué es la función lchown()?
lchown() es una función integrada de PHP que establece el usuario (propietario) de un enlace simbólico. El prefijo "l" significa que opera sobre el enlace, no sobre el archivo al que apunta — la misma convención usada por las llamadas de la biblioteca C subyacente (lchown frente a chown).
Esta distinción solo importa para los enlaces simbólicos. Un enlace simbólico es un archivo pequeño que almacena una ruta a otro archivo. La mayoría de las llamadas del sistema de archivos desreferencian un enlace simbólico automáticamente: si llamas a chown() sobre un enlace simbólico, cambias el propietario del archivo destino. lchown() es la variante que se detiene en el enlace y cambia la propiedad del propio enlace.
lchown() es la contraparte de propiedad de usuario de lchgrp(), que cambia el grupo de un enlace simbólico.
Sintaxis
lchown(string $filename, string|int $user): bool| Parámetro | Descripción |
|---|---|
$filename | Ruta al enlace simbólico cuyo propietario deseas cambiar. |
$user | El nuevo propietario — ya sea un nombre de usuario (string) como 'www-data' o un ID de usuario numérico (int) como 33. |
Valor de retorno. lchown() devuelve true en caso de éxito y false en caso de fallo (y emite una advertencia, por ejemplo cuando no tienes permisos o la ruta no existe).
Ejemplo básico
<?php
$link = '/path/to/link';
$user = 'myuser';
if (lchown($link, $user)) {
echo 'Ownership of symbolic link updated successfully';
} else {
echo 'Failed to update ownership of symbolic link';
}Aquí el propietario del enlace simbólico /path/to/link se establece en myuser. El if comprueba el resultado booleano para que puedas reaccionar ante un fallo en lugar de ignorarlo silenciosamente.
lchown() vs chown(): por qué importa
La diferencia es más fácil de ver cuando un enlace y su destino tienen propietarios distintos. Supón que report.txt es un archivo real y latest es un enlace simbólico a él:
<?php
$target = '/var/data/report.txt';
$link = '/var/data/latest'; // symlink -> report.txt
// Changes the OWNER OF report.txt (chown follows the link):
chown($link, 'alice');
// Changes the OWNER OF the symlink "latest" only; report.txt is untouched:
lchown($link, 'bob');Usa lchown() siempre que quieras que cambien los metadatos del enlace sin tocar — ni reasignar accidentalmente — el archivo al que apunta. Usar chown() aquí sería un error si tu intención era cambiar la propiedad del propio enlace.
Demostración de extremo a extremo
Este script crea un archivo real y un enlace simbólico hacia él, luego cambia el propietario del enlace al usuario actual y confirma el resultado. Dado que cambiar la propiedad normalmente requiere privilegios elevados, volver a asignar al usuario actual es el único caso que un usuario ordinario puede hacer.
<?php
$target = sys_get_temp_dir() . '/lchown_target.txt';
$link = sys_get_temp_dir() . '/lchown_link';
file_put_contents($target, "hello\n");
@unlink($link); // remove any leftover link from a previous run
symlink($target, $link); // create the symbolic link
$me = posix_getpwuid(posix_geteuid())['name']; // current process user
if (lchown($link, $me)) {
echo "Link owner set to: " . posix_getpwuid(lstat($link)['uid'])['name'] . "\n";
} else {
echo "lchown() failed\n";
}Se usa lstat() (en lugar de stat()) para leer los metadatos propios del enlace, de forma paralela a cómo lchown() los escribe.
Permisos y consideraciones importantes
- Se requieren privilegios. Cambiar el propietario de un elemento a otro usuario generalmente requiere acceso de root. Como usuario no root, normalmente solo puedes "cambiar" el propietario a ti mismo, lo que en la práctica no tiene efecto. De lo contrario, espera
falsemás una advertencia. - Windows.
lchown()es una operación de estilo POSIX y no está disponible en Windows. Está pensada para sistemas de archivos tipo Unix. - La ruta debe ser un enlace simbólico. Apuntar
lchown()a un archivo regular sigue funcionando a través del sistema operativo, pero todo el propósito de la función son los enlaces simbólicos — usachown()para archivos ordinarios. - Suprime, no ignores. Los fallos generan un
E_WARNING. Es preferible comprobar el valor de retorno (como se muestra arriba) en lugar de silenciar la advertencia con@y esperar que todo salga bien.
Funciones relacionadas
chown()— cambia el propietario de un archivo (sigue los enlaces simbólicos).lchgrp()— cambia el grupo de un enlace simbólico.chgrp()— cambia el grupo de un archivo.fileowner()— lee el ID de usuario del propietario de un archivo.symlink()— crea un enlace simbólico.readlink()— devuelve el destino al que apunta un enlace simbólico.
Conclusión
lchown() cambia el propietario del propio enlace simbólico en lugar del archivo al que apunta — la razón clave para usarla en vez de chown(). Recuerda que necesita los privilegios apropiados, solo funciona en Unix y devuelve un valor booleano que siempre debes comprobar.