fileinode()
Die PHP-Funktion fileinode() gibt die Inode-Nummer einer Datei als Integer zurück oder false bei Fehler.
Was ist die Funktion fileinode()?
Die PHP-Funktion fileinode() gibt die Inode-Nummer einer Datei zurück. Ein Inode (Index-Node) ist der interne Bezeichner, den das Dateisystem verwendet, um die Metadaten und Datenblöcke einer Datei auf dem Datenträger zu verfolgen – der eigentliche Eintrag, auf den der Dateiname verweist. Zwei Dateinamen, die dieselbe Inode-Nummer teilen, sind Hard Links zur selben physischen Datei. Daher ist fileinode() die Standardmethode, um dies zu erkennen.
Diese Seite behandelt die Syntax, den Rückgabewert, den Umgang mit fehlenden Dateien, den Stat-Cache sowie die praktischen Gründe, warum man diese Funktion einsetzen würde.
Syntax
fileinode(string $filename): int|false$filename— der Pfad zur Datei, die Sie untersuchen möchten.- Rückgabewert — die Inode-Nummer als Integer bei Erfolg oder
falsebei Fehler (zum Beispiel wenn die Datei nicht existiert). Auf den meisten 64-Bit-Systemen ist der Wert eine große ganze Zahl.
Einfaches Beispiel
Das folgende Beispiel verwendet __FILE__ (die magische Konstante für den Pfad des aktuell ausgeführten Skripts), sodass es stets auf eine tatsächlich vorhandene Datei zeigt:
<?php
$filename = __FILE__;
$inode = fileinode($filename);
echo "The inode number of $filename is $inode";Ausgabe (die genaue Nummer hängt von Ihrem Dateisystem ab):
The inode number of /path/to/script.php is 326428208Wir übergeben den Pfad an fileinode(), speichern den zurückgegebenen Integer in $inode und geben ihn aus.
Fehlerbehandlung
Wenn die Datei nicht existiert (oder nicht zugänglich ist), gibt fileinode() false zurück und gibt eine E_WARNING aus. Verwenden Sie den strikten Vergleich (===), damit eine legitime Inode-Nummer von 0 nicht als Fehler missverstanden wird:
<?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";
}Ausgabe:
Could not read the inode for does-not-exist.txt — it may not exist.Ein sichereres Muster ist es, die Existenz zuerst mit file_exists() zu prüfen, anstatt Warnungen zu unterdrücken.
Hard Links erkennen
Der häufigste praktische Einsatz von fileinode() ist der Vergleich zweier Pfade: Wenn sie auf demselben Dateisystem dieselbe Inode-Nummer melden, handelt es sich um dieselbe Datei, die unter verschiedenen Namen zugänglich ist.
<?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.";
}Der Stat-Cache
PHP speichert die Ergebnisse von Dateisystem-Stat-Aufrufen (fileinode(), filesize(), filemtime() und ähnliche) zur Leistungsoptimierung zwischen. Wenn eine Datei ersetzt oder neu verlinkt wird, während Ihr Skript läuft, erhalten Sie möglicherweise einen veralteten Inode. Rufen Sie clearstatcache() auf, um PHP zu zwingen, aktuelle Metadaten zu lesen:
<?php
$first = fileinode(__FILE__);
clearstatcache(); // discard cached stat data
$second = fileinode(__FILE__);
var_dump($first === $second); // bool(true) — unchanged fileWann würde ich es verwenden?
- Deduplizierung — Dateien gruppieren, die Hard Links zu denselben Daten sind, anstatt sie zu kopieren.
- Umbenennen vs. neue Datei erkennen — ein geänderter Name mit derselben Inode-Nummer ist eine Umbenennung, keine neue Datei.
- Diagnose und Werkzeuge — passt gut zu den anderen Stat-Funktionen bei der Analyse eines Verzeichnisses.
Den vollständigen Satz an Metadaten auf einmal liefert stat(). Für spezifische Attribute gibt es dedizierte Funktionen: filesize(), filemtime(), fileatime(), filetype() und fileperms().
Fazit
fileinode() gibt die Inode-Nummer einer Datei im Dateisystem als Integer zurück oder false bei Fehler. Über das bloße Lesen der Nummer hinaus liegt ihr eigentlicher Nutzen darin, festzustellen, ob zwei Pfade auf dieselbe zugrunde liegende Datei verweisen. Verwenden Sie stets === beim Vergleich, prüfen Sie auf fehlende Dateien und rufen Sie clearstatcache() auf, wenn eine Datei sich während der Skriptausführung geändert haben könnte.