W3docs

link()

La fonction link() de PHP crée un lien physique vers un fichier existant. Syntaxe, exemple complet et différences avec les liens symboliques.

La fonction PHP link() crée un lien physique — une seconde entrée dans le système de fichiers qui pointe vers exactement les mêmes données sur le disque qu'un fichier existant. Cette page explique ce qu'est réellement un lien physique, la syntaxe et la valeur de retour de la fonction, un exemple complet exécutable, ses différences avec un lien symbolique, et les pièges qui peuvent provoquer un échec.

link() crée un lien physique depuis un fichier existant (la cible) vers un nouveau nom (le lien). Un lien physique n'est ni une copie ni un raccourci : c'est une seconde entrée de répertoire qui référence le même inode — l'objet sous-jacent sur le disque qui stocke les données et les métadonnées d'un fichier. Comme les deux noms pointent vers le même inode, ils sont totalement interchangeables : modifier le fichier via l'un des noms modifie ce qu'on voit via l'autre, et les données ne sont supprimées qu'une fois que tous les liens physiques vers le fichier sont retirés.

Deux conséquences en découlent directement :

  • Les liens physiques doivent se trouver sur le même système de fichiers (partition) que la cible. Les inodes sont locaux à un système de fichiers, il n'est donc pas possible de créer un lien physique entre deux disques ou points de montage différents. Si vous avez besoin de lier des fichiers à travers plusieurs systèmes de fichiers, utilisez un lien symbolique — voir symlink().
  • Il n'est généralement pas possible de créer un lien physique vers un répertoire. La plupart des systèmes d'exploitation l'interdisent afin d'éviter des cycles de référence dans l'arborescence du système de fichiers.

Syntaxe

link(string $target, string $link): bool
ParamètreDescription
$targetChemin vers le fichier existant auquel vous souhaitez créer un lien.
$linkChemin du nouveau lien physique à créer (ne doit pas déjà exister).

La fonction retourne true en cas de succès et false en cas d'échec, en émettant un E_WARNING lorsqu'elle échoue.

Un exemple complet et exécutable

Cet exemple crée un fichier, y crée un lien physique, puis prouve que les deux noms partagent le même inode :

<?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";

Résultat :

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

Notez qu'après link(), le nombre de liens (nlink) vaut 2 — l'inode possède désormais deux noms. Supprimer un nom avec unlink() décrémente simplement ce compteur ; les données survivent jusqu'à ce que le compteur atteigne zéro. C'est précisément la raison pour laquelle supprimer un fichier lié physiquement ne libère pas son espace disque si d'autres liens physiques existent encore.

Gérer les échecs de manière élégante

Comme link() émet un avertissement en cas d'échec, dans le code de production on supprime généralement l'avertissement avec @ et on agit sur la valeur de retour, ou on vérifie la destination au préalable :

<?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";
}

Raisons courantes pour lesquelles link() retourne false :

  • Le fichier cible n'existe pas, ou vous n'avez pas les droits de lecture dessus.
  • Vous n'avez pas la permission d'écriture dans le répertoire où le lien sera créé.
  • Le chemin du lien existe déjà.
  • La cible et le lien se trouvent sur des systèmes de fichiers différents.
  • La cible est un répertoire (non autorisé sur la plupart des systèmes).

Lien physique vs. lien symbolique

Lien physique (link())Lien symbolique (symlink())
Pointe versLe même inode (données)Un chemin (un autre nom de fichier)
Survit à la suppression de l'originalOui — les données restent jusqu'à la suppression de tous les liensNon — devient un lien mort
Peut traverser les systèmes de fichiersNonOui
Peut lier un répertoireGénéralement nonOui
Détecter avecstat()['nlink'] > 1is_link()

Si vous avez besoin de savoir si un chemin est un lien symbolique, ou de lire vers quoi il pointe, consultez is_link() et readlink(). Pour inspecter les métadonnées d'un lien, utilisez linkinfo().

Dans quels cas utiliser cette fonction ?

Les liens physiques sont utiles pour la déduplication et les échanges de fichiers atomiques. Les outils de sauvegarde les utilisent afin que les fichiers inchangés entre les instantanés partagent une seule copie sur le disque. Les scripts de déploiement créent un lien physique vers un nouveau build puis renomment en remplacement de l'ancien nom, de sorte que les lecteurs ne voient jamais un fichier à moitié écrit. Pour des besoins de « raccourci » ordinaires qui traversent des disques ou pointent vers des répertoires, préférez symlink().

Conclusion

link() crée un lien physique — un second nom pour le même inode sur le même système de fichiers. Les données subsistent jusqu'à la suppression du dernier lien physique, les liens ne peuvent pas traverser les systèmes de fichiers, et les répertoires ne peuvent généralement pas être liés physiquement. Utilisez l'exemple exécutable ci-dessus pour observer par vous-même le comportement des inodes partagés, et associez link() à unlink(), symlink() et is_link() pour un contrôle complet des liens du système de fichiers. Pour un tour d'horizon plus large des fonctions de fichiers, consultez le chapitre PHP Filesystem.

Pratique

Pratique
Que crée la fonction link() de PHP ?
Que crée la fonction link() de PHP ?
Was this page helpful?