linkinfo()
La funzione linkinfo() in PHP restituisce informazioni su un hard link, utile per verificarne l'esistenza e ottenere l'identificatore del dispositivo.
Cos'è la funzione linkinfo()?
La funzione linkinfo() è una funzione PHP incorporata che verifica se un link esiste effettivamente e, nei sistemi Unix, restituisce il dispositivo su cui risiede. In particolare, restituisce il campo st_dev della struttura C stat prodotta dalla chiamata di sistema lstat() — un intero che identifica il dispositivo (disco/partizione) che contiene il link.
In pratica, linkinfo() è più utile come rapido controllo di esistenza: se restituisce 0 o un intero positivo, il link esiste; se restituisce -1 o false, il percorso è mancante, interrotto o inaccessibile. Nonostante il nome, non restituisce il numero di hard link — tale informazione proviene dall'elemento nlink di stat() o lstat().
Questa pagina tratta la sintassi della funzione, i valori restituiti, un esempio eseguibile, le insidie comuni e le funzioni filesystem correlate.
Sintassi
linkinfo(string $path): int|falseLa funzione accetta un singolo parametro:
$path— il percorso del link simbolico o hard link che si desidera ispezionare.
Restituisce:
- un intero non negativo (l'identificatore del dispositivo
st_dev) quando il link esiste, -1quando il link non può essere letto malstatha successo parziale, oppurefalsese$pathnon esiste o non è accessibile.
Poiché 0 è un valore di ritorno valido, "truthy-but-falsy" su alcune piattaforme, confrontare sempre con !== false anziché affidarsi a un test booleano approssimativo.
Come usare la funzione linkinfo()
Seguire questi passaggi:
- Specificare il percorso del link simbolico o hard link da controllare.
- Chiamare
linkinfo(), passando il percorso. - Confrontare il risultato rigorosamente con
falseper stabilire se il link esiste.
L'esempio seguente crea un file reale e un link simbolico ad esso, quindi ispeziona il link con linkinfo():
<?php
// Set up a file and a symbolic link to it in the temp directory.
$target = tempnam(sys_get_temp_dir(), 'tgt');
$link = sys_get_temp_dir() . '/example_link';
@unlink($link); // remove a leftover link from a previous run
symlink($target, $link); // create the symlink
$info = linkinfo($link);
if ($info !== false) {
echo "The link '$link' exists. Device id (st_dev): $info" . PHP_EOL;
} else {
echo "The link '$link' does not exist or is inaccessible." . PHP_EOL;
}
// A path that doesn't exist fails: false on most systems, -1 on some
// Unix builds (a warning may also be emitted), so treat both as "missing".
$missing = @linkinfo('/no/such/link');
var_dump($missing === false || $missing === -1); // bool(true) -> "missing"
// Clean up.
unlink($link);
unlink($target);Una tipica esecuzione stampa qualcosa del genere:
The link '/tmp/example_link' exists. Device id (st_dev): 16777220
bool(true)L'id del dispositivo esatto dipende dal sistema operativo e dal filesystem, quindi non codificarlo a dura — solo la sua presenza è significativa. Per il percorso mancante, PHP restituisce false sulla maggior parte delle piattaforme e -1 su alcune build Unix, motivo per cui l'esempio tratta entrambi come "non trovato."
Insidie Comuni
- Windows.
linkinfo()non è significativo su Windows e indica sostanzialmente solo se il percorso è un link. Fare affidamento su di esso per l'esistenza, non per il numero del dispositivo. - Usare
!== false, non!$info. Su alcuni sistemi un link valido restituisce0, che un controllo approssimativo tratterebbe come "mancante." - Non segue il link.
linkinfo()ispeziona il link stesso (comelstat), non il file a cui punta il link. Un symlink verso un target eliminato viene comunque segnalato come esistente. - Non per contare gli hard link. Usare
stat($path)['nlink']se si necessita del conteggio degli hard link.
Funzioni Correlate
symlink()— crea un link simbolico.link()— crea un hard link.readlink()— restituisce il target a cui punta un link simbolico.is_link()— verifica se un percorso è un link simbolico.lstat()— informazioni di stato complete per un link senza seguirlo.
Conclusione
La funzione linkinfo() è un metodo leggero per confermare che un link esiste e per leggere il dispositivo su cui risiede, rispecchiando il campo st_dev di lstat(). Usarla per i controlli di esistenza (sempre con un confronto rigoroso !== false), e ricorrere a stat() o is_link() quando si necessitano dettagli più ricchi come il conteggio degli hard link o il tipo di link.