is_link()
La funzione is_link() di PHP verifica se un dato percorso è un collegamento simbolico e restituisce true se il percorso è un symlink.
Cosa fa la funzione is_link()
Un collegamento simbolico (o symlink) è un file speciale che punta a un altro file o directory, simile a un collegamento rapido. La funzione is_link() è una funzione PHP integrata che indica se un dato percorso è esso stesso un collegamento simbolico.
Restituisce:
true— se il percorso esiste ed è un collegamento simbolico.false— se il percorso è un file o una directory normale, non esiste o non può essere letto.
Un punto importante che spesso confonde: is_link() esamina il percorso stesso, non ciò a cui il collegamento punta. Un symlink che punta a un file normale viene comunque segnalato come collegamento da is_link(), anche se is_file() restituirebbe true per lo stesso percorso (perché segue il collegamento fino al suo bersaglio).
Questa pagina tratta la sintassi, un esempio completo ed eseguibile, il problema più comune (la cache delle stat) e le differenze tra is_link() e i controlli correlati del filesystem.
Sintassi
is_link(string $filename): bool$filename è il percorso da verificare. La funzione restituisce un boolean.
Un Esempio Completo ed Eseguibile
Poiché un symlink raramente esiste in un percorso fisso nel codice, il modo più affidabile per vedere is_link() in azione è crearne uno prima con symlink(), verificarlo e poi fare pulizia:
<?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) è true perché il percorso è il symlink, mentre is_link($target) è false perché il bersaglio è un file ordinario. Si noti che is_file($link) è true — risolve il collegamento e testa il bersaglio.
Il Problema della Cache delle Stat
PHP memorizza nella cache i risultati delle funzioni del filesystem come is_link(), is_file() e file_exists() per motivi di prestazioni. Se si crea, elimina o sostituisce un symlink durante la stessa esecuzione dello script e poi lo si verifica di nuovo, si potrebbe ottenere un risultato non aggiornato. Chiamare clearstatcache() per forzare una nuova lettura:
<?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() a Confronto con le Funzioni Correlate
| Funzione | Restituisce true quando il percorso è… |
|---|---|
is_link() | un collegamento simbolico (non segue il collegamento) |
is_file() | un file normale (segue i collegamenti fino al bersaglio) |
is_dir() | una directory (segue i collegamenti fino al bersaglio) |
file_exists() | il bersaglio esiste (segue i collegamenti) |
Per ispezionare dove punta un collegamento, usare readlink(); per risolvere un percorso con tutti i symlink espansi, usare realpath().
Quando Usarla?
- Script di deploy che cambiano un symlink
currenttra le directory di rilascio e devono verificare che sia effettivamente un collegamento prima di sostituirlo. - Strumenti di backup o sincronizzazione che devono decidere se copiare il collegamento stesso o il file a cui punta.
- Controlli di sicurezza che rifiutano percorsi forniti dall'utente che si insinuano tramite symlink che puntano al di fuori di una directory consentita.
Conclusione
is_link() risponde a una domanda precisa: questo percorso è un collegamento simbolico? Testa il percorso stesso invece di seguirlo, restituisce false per percorsi mancanti e condivide la cache delle stat di PHP — quindi chiamare clearstatcache() se si modificano i collegamenti durante l'esecuzione dello script. Abbinarla con is_file(), readlink() e realpath() quando si ha bisogno di sapere a cosa punta un collegamento.