is_link()
La función is_link() de PHP comprueba si una ruta dada es un enlace simbólico y devuelve true si lo es.
Qué hace la función is_link()
Un enlace simbólico (o symlink) es un archivo especial que apunta a otro archivo o directorio, similar a un acceso directo. La función is_link() es una función integrada de PHP que indica si una ruta dada es en sí misma un enlace simbólico.
Devuelve:
true— si la ruta existe y es un enlace simbólico.false— si la ruta es un archivo o directorio normal, no existe o no se puede leer.
Un punto clave que suele confundir: is_link() examina la ruta en sí misma, no aquello a lo que apunta el enlace. Un symlink que apunta a un archivo normal sigue siendo reportado como enlace por is_link(), aunque is_file() también devolvería true para la misma ruta (porque sigue el enlace hasta su destino).
Esta página cubre la sintaxis, un ejemplo completo ejecutable, el problema más común (la caché de stat) y cómo is_link() se diferencia de otras comprobaciones de sistema de archivos relacionadas.
Sintaxis
is_link(string $filename): bool$filename es la ruta a comprobar. La función devuelve un boolean.
Un ejemplo completo y ejecutable
Como un symlink rara vez existe en una ruta fija, la forma más fiable de ver is_link() en acción es crear uno primero con symlink(), comprobarlo y luego limpiarlo:
<?php
$target = tempnam(sys_get_temp_dir(), 'tgt'); // a real regular file
$link = sys_get_temp_dir() . '/my_symlink';
// Make sure we start clean, then create the symlink.
@unlink($link);
symlink($target, $link);
var_dump(is_link($link)); // bool(true) — the path is a symlink
var_dump(is_link($target)); // bool(false) — the target is a regular file
var_dump(is_file($link)); // bool(true) — is_file() follows the link
// Clean up.
unlink($link);
unlink($target);is_link($link) es true porque la ruta es el symlink, mientras que is_link($target) es false porque el destino es un archivo ordinario. Nótese que is_file($link) es true — resuelve el enlace y evalúa el destino.
El problema con la caché de stat
PHP almacena en caché los resultados de funciones del sistema de archivos como is_link(), is_file() y file_exists() por motivos de rendimiento. Si crea, elimina o reemplaza un symlink durante la misma ejecución del script y luego lo vuelve a comprobar, puede obtener un resultado desactualizado. Llame a clearstatcache() para forzar una lectura actualizada:
<?php
$link = sys_get_temp_dir() . '/cache_demo';
@unlink($link);
symlink(__FILE__, $link);
var_dump(is_link($link)); // bool(true)
unlink($link);
clearstatcache(); // without this, the next check may still say true
var_dump(is_link($link)); // bool(false)is_link() frente a funciones relacionadas
| Función | Devuelve true cuando la ruta es… |
|---|---|
is_link() | un enlace simbólico (no sigue el enlace) |
is_file() | un archivo normal (sigue los enlaces al destino) |
is_dir() | un directorio (sigue los enlaces al destino) |
file_exists() | el destino existe (sigue los enlaces) |
Para inspeccionar adónde apunta un enlace, use readlink(); para resolver una ruta con todos los symlinks expandidos, use realpath().
¿Cuándo usarla?
- Scripts de despliegue que cambian un symlink
currententre directorios de versiones y necesitan confirmar que es realmente un enlace antes de reemplazarlo. - Herramientas de copia de seguridad o sincronización que deben decidir si copiar el propio enlace o el archivo al que apunta.
- Comprobaciones de seguridad que rechazan rutas proporcionadas por el usuario que se cuelan mediante symlinks que apuntan fuera de un directorio permitido.
Conclusión
is_link() responde una pregunta precisa: ¿es esta ruta un enlace simbólico? Evalúa la propia ruta en lugar de seguirla, devuelve false para rutas inexistentes y comparte la caché de stat de PHP — así que llame a clearstatcache() si modifica enlaces durante la ejecución del script. Combínela con is_file(), readlink() y realpath() cuando necesite saber a qué apunta un enlace.