fileinode()
La funzione fileinode() è una funzione PHP integrata che restituisce il numero di inode di un file come intero.
Cos'è la funzione fileinode()?
La funzione PHP fileinode() restituisce il numero di inode di un file. Un inode (nodo indice) è l'identificatore che il filesystem utilizza internamente per tracciare i metadati di un file e i blocchi di dati sul disco — la voce effettiva a cui punta il nome del file. Due nomi di file che condividono lo stesso numero di inode sono hard link allo stesso file fisico, quindi fileinode() è il metodo standard per rilevarlo.
Questa pagina tratta la sintassi, il valore di ritorno, come gestire i file mancanti, la cache delle statistiche che la influenza e i motivi pratici per cui potreste utilizzarla.
Sintassi
fileinode(string $filename): int|false$filename— il percorso del file da ispezionare.- Valore di ritorno — il numero di inode come intero in caso di successo, oppure
falsein caso di errore (ad esempio, quando il file non esiste). Sulla maggior parte dei sistemi a 64 bit il valore è un intero di grandi dimensioni.
Esempio di base
L'esempio seguente usa __FILE__ (la costante magica per il percorso dello script in esecuzione) in modo da puntare sempre a un file che esiste realmente:
<?php
$filename = __FILE__;
$inode = fileinode($filename);
echo "The inode number of $filename is $inode";Output (il numero esatto dipende dal filesystem):
The inode number of /path/to/script.php is 326428208Passiamo il percorso a fileinode(), memorizziamo l'intero restituito in $inode e lo stampiamo.
Gestione degli errori
Quando il file non esiste (o non è accessibile), fileinode() restituisce false ed emette un E_WARNING. Usate il confronto stretto (===) affinché un inode legittimo di valore 0 non venga mai confuso con un errore:
<?php
$filename = 'does-not-exist.txt';
$inode = @fileinode($filename); // @ suppresses the warning
if ($inode === false) {
echo "Could not read the inode for $filename — it may not exist.";
} else {
echo "Inode: $inode";
}Output:
Could not read the inode for does-not-exist.txt — it may not exist.Un approccio più sicuro è verificare prima l'esistenza del file con file_exists() anziché sopprimere gli avvisi.
Rilevamento degli hard link
L'uso più comune di fileinode() nel mondo reale è il confronto tra due percorsi: se riportano lo stesso numero di inode sullo stesso filesystem, si tratta dello stesso file a cui si accede con nomi diversi.
<?php
$a = fileinode('/path/to/original.txt');
$b = fileinode('/path/to/hardlink.txt');
if ($a !== false && $a === $b) {
echo "Both names point to the same file (hard link).";
} else {
echo "These are distinct files.";
}La cache delle statistiche
PHP memorizza nella cache i risultati delle chiamate stat del filesystem (fileinode(), filesize(), filemtime() e simili) per migliorare le prestazioni. Se un file viene sostituito o ricollegato mentre lo script è in esecuzione, si potrebbe ottenere un inode obsoleto. Chiamate clearstatcache() per forzare PHP a leggere i metadati aggiornati:
<?php
$first = fileinode(__FILE__);
clearstatcache(); // discard cached stat data
$second = fileinode(__FILE__);
var_dump($first === $second); // bool(true) — unchanged fileQuando usarla?
- Deduplicazione — raggruppate i file che sono hard link agli stessi dati invece di copiarli.
- Rilevamento di rinomine vs. nuovi file — un nome cambiato con lo stesso inode è una rinomina, non un nuovo file.
- Diagnostica e strumenti — si abbina naturalmente alle altre funzioni stat quando si controlla una directory.
Per l'insieme completo dei metadati in una sola chiamata, consultate stat(). Per attributi specifici esistono funzioni dedicate: filesize(), filemtime(), fileatime(), filetype() e fileperms().
Conclusione
fileinode() restituisce il numero di inode del filesystem di un file come intero, oppure false in caso di errore. Al di là della semplice lettura del numero, il suo vero valore sta nell'identificare quando due percorsi fanno riferimento allo stesso file sottostante. Confrontate sempre con ===, gestite i file mancanti e chiamate clearstatcache() quando un file potrebbe essere cambiato durante l'esecuzione dello script.