is_link()
La fonction is_link() vérifie si un chemin donné est un lien symbolique. Elle retourne true si le chemin est un lien symbolique.
Ce que fait la fonction is_link()
Un lien symbolique (ou symlink) est un fichier spécial qui pointe vers un autre fichier ou répertoire, un peu comme un raccourci. La fonction is_link() est une fonction PHP intégrée qui indique si un chemin donné est lui-même un lien symbolique.
Elle retourne :
true— si le chemin existe et est un lien symbolique.false— si le chemin est un fichier ou répertoire ordinaire, n'existe pas ou ne peut pas être lu.
Un point important qui surprend souvent : is_link() examine le chemin lui-même, et non ce vers quoi pointe le lien. Un symlink pointant vers un fichier ordinaire est toujours signalé comme un lien par is_link(), même si is_file() retournerait également true pour le même chemin (car il suit le lien jusqu'à sa cible).
Cette page couvre la syntaxe, un exemple complet et exécutable, le piège le plus courant (le cache stat), et en quoi is_link() diffère des autres vérifications du système de fichiers.
Syntaxe
is_link(string $filename): bool$filename est le chemin à vérifier. La fonction retourne un booléen.
Un exemple complet et exécutable
Comme un symlink existe rarement à un chemin codé en dur, la façon la plus fiable de voir is_link() fonctionner est d'en créer un d'abord avec symlink(), de le vérifier, puis de nettoyer :
<?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) est true car le chemin est le symlink, tandis que is_link($target) est false car la cible est un fichier ordinaire. Notez que is_file($link) est true — il résout le lien et teste la cible.
Le piège du cache stat
PHP met en cache les résultats des fonctions du système de fichiers comme is_link(), is_file() et file_exists() pour des raisons de performance. Si vous créez, supprimez ou remplacez un symlink pendant l'exécution du même script et que vous le revérifiez ensuite, vous risquez d'obtenir un résultat périmé. Appelez clearstatcache() pour forcer une nouvelle lecture :
<?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() vs. les fonctions associées
| Fonction | Retourne true quand le chemin est… |
|---|---|
is_link() | un lien symbolique (ne suit pas le lien) |
is_file() | un fichier ordinaire (suit les liens vers la cible) |
is_dir() | un répertoire (suit les liens vers la cible) |
file_exists() | la cible existe (suit les liens) |
Pour inspecter où pointe un lien, utilisez readlink() ; pour résoudre un chemin avec tous les symlinks développés, utilisez realpath().
Quand l'utiliser ?
- Les scripts de déploiement qui font basculer un symlink
currententre des répertoires de versions et doivent confirmer qu'il s'agit bien d'un lien avant de le remplacer. - Les outils de sauvegarde ou de synchronisation qui doivent décider de copier le lien lui-même ou le fichier vers lequel il pointe.
- Les contrôles de sécurité qui rejettent les chemins fournis par l'utilisateur qui s'introduisent via des symlinks pointant en dehors d'un répertoire autorisé.
Conclusion
is_link() répond à une question précise : ce chemin est-il un lien symbolique ? Elle teste le chemin lui-même plutôt que de le suivre, retourne false pour les chemins manquants, et partage le cache stat de PHP — donc appelez clearstatcache() si vous modifiez des liens en cours d'exécution du script. Associez-la à is_file(), readlink() et realpath() lorsque vous avez besoin de savoir vers quoi pointe un lien.