W3docs

link()

La función link() de PHP crea un enlace duro hacia un archivo existente. Aprende su sintaxis, valor de retorno y diferencias con los enlaces simbólicos.

La función link() de PHP crea un enlace duro — una segunda entrada del sistema de archivos que apunta exactamente a los mismos datos en disco que un archivo existente. Esta página explica qué es realmente un enlace duro, la sintaxis y el valor de retorno de la función, un ejemplo completo ejecutable, cómo se diferencia de un enlace simbólico y los problemas que pueden provocar fallos.

link() crea un enlace duro desde un archivo existente (el destino) hacia un nuevo nombre (el enlace). Un enlace duro no es una copia ni un acceso directo: es una segunda entrada de directorio que referencia el mismo inodo — el objeto en disco subyacente que almacena los datos y metadatos del archivo. Como ambos nombres apuntan al mismo inodo, son completamente intercambiables: editar a través de un nombre cambia lo que ves a través del otro, y los datos del archivo solo se eliminan cuando se elimina cada enlace duro hacia él.

Dos consecuencias se derivan directamente de esto:

  • Los enlaces duros deben estar en el mismo sistema de archivos (partición) que el destino. Los inodos son locales a un sistema de archivos, por lo que no se puede crear un enlace duro entre unidades o puntos de montaje. Si necesitas enlazar entre sistemas de archivos, usa un enlace simbólico — consulta symlink().
  • Generalmente no se puede crear un enlace duro a un directorio. La mayoría de los sistemas operativos prohíben los enlaces duros a directorios para evitar ciclos de referencia en el árbol del sistema de archivos.

Sintaxis

link(string $target, string $link): bool
ParámetroDescripción
$targetRuta al archivo existente al que deseas enlazar.
$linkRuta del nuevo enlace duro a crear (no debe existir aún).

La función devuelve true en caso de éxito y false en caso de fallo, emitiendo un E_WARNING cuando falla.

Un Ejemplo Completo y Ejecutable

Este ejemplo crea un archivo, lo enlaza de forma dura y luego demuestra que ambos nombres comparten un mismo inodo:

<?php

$target = __DIR__ . '/target.txt';
$link   = __DIR__ . '/hardlink.txt';

file_put_contents($target, "Hello hard links\n");

if (link($target, $link)) {
    echo "Created hard link\n";
}

echo "Same inode? " . (fileinode($target) === fileinode($link) ? "yes" : "no") . "\n";
echo "Link count: " . stat($target)['nlink'] . "\n";
echo "Read via link: " . file_get_contents($link);

unlink($link); // remove only the new name
echo "After unlink, target still exists? " . (file_exists($target) ? "yes" : "no") . "\n";

Salida:

Created hard link
Same inode? yes
Link count: 2
Read via link: Hello hard links
After unlink, target still exists? yes

Observa que después de link() el número de enlaces (nlink) es 2 — el inodo ahora tiene dos nombres. Eliminar un nombre con unlink() simplemente decrementa ese contador; los datos sobreviven hasta que el contador llega a cero. Esta es exactamente la razón por la que eliminar un archivo con enlace duro no libera espacio en disco si quedan otros enlaces duros.

Manejo de Fallos de Forma Correcta

Como link() emite una advertencia al fallar, en código de producción normalmente se suprime la advertencia con @ y se actúa en función del valor de retorno, o se comprueba el destino primero:

<?php

$target = __DIR__ . '/target.txt';
$link   = __DIR__ . '/hardlink.txt';

if (file_exists($link)) {
    echo "A file already exists at the link path.\n";
} elseif (@link($target, $link)) {
    echo "Hard link created.\n";
} else {
    echo "Could not create hard link.\n";
}

Razones comunes por las que link() devuelve false:

  • El archivo destino no existe, o no tienes permiso de lectura sobre él.
  • No tienes permiso de escritura en el directorio donde se creará el enlace.
  • La ruta del enlace ya existe.
  • El destino y el enlace están en sistemas de archivos diferentes.
  • El destino es un directorio (no permitido en la mayoría de los sistemas).

Enlace Duro vs. Enlace Simbólico

Enlace duro (link())Enlace simbólico (symlink())
Apunta aEl mismo inodo (datos)Una ruta (otro nombre de archivo)
Sobrevive al borrar el originalSí — los datos persisten hasta que se eliminan todos los enlacesNo — se convierte en un enlace roto
Puede cruzar sistemas de archivosNo
Puede enlazar un directorioGeneralmente no
Detectar constat()['nlink'] > 1is_link()

Si necesitas saber si una ruta es un enlace simbólico, o leer a dónde apunta, consulta is_link() y readlink(). Para inspeccionar los metadatos de un enlace, usa linkinfo().

¿Cuándo Usar Esto?

Los enlaces duros son útiles para la deduplicación y los intercambios atómicos de archivos. Las herramientas de copia de seguridad los usan para que los archivos sin cambios entre instantáneas compartan una sola copia en disco. Los scripts de despliegue enlazan de forma dura una nueva compilación y luego renombran sobre el nombre anterior para que los lectores nunca vean un archivo a medio escribir. Para las necesidades habituales de "acceso directo" que cruzan unidades o apuntan a directorios, usa symlink() en su lugar.

Conclusión

link() crea un enlace duro — un segundo nombre para el mismo inodo en el mismo sistema de archivos. Los datos persisten hasta que se elimina el último enlace duro, los enlaces no pueden cruzar sistemas de archivos y los directorios generalmente no pueden tener enlaces duros. Usa el ejemplo ejecutable anterior para ver el comportamiento del inodo compartido por ti mismo, y combina link() con unlink(), symlink() e is_link() para tener control total sobre los enlaces del sistema de archivos. Para una visión más amplia de las funciones de archivo, consulta el capítulo PHP Filesystem.

Práctica

Práctica
¿Qué crea la función link() de PHP?
¿Qué crea la función link() de PHP?
Was this page helpful?