Signatur
Beschreibung
fstat() funktioniert ähnlich wie stat(), arbeitet jedoch nicht mit einem Dateipfad, sondern mit einem bereits geöffneten Datei-Handle (Resource). Das ist besonders nützlich, wenn eine Datei bereits geöffnet ist und ein erneutes Öffnen vermieden werden soll oder wenn der genaue Pfad nicht mehr bekannt ist.
Der Rückgabewert ist ein Array mit 26 Elementen – 13 numerisch indexiert und 13 assoziativ. Wichtige Felder sind: size (Dateigröße in Bytes), mtime (Zeitpunkt der letzten Änderung als Unix-Timestamp), mode (Dateiberechtigungen), uid/gid (Eigentümer-IDs) sowie ino (Inode-Nummer).
fstat() ist besonders praktisch nach Schreiboperationen, um die tatsächliche Dateigröße zu prüfen, oder in Szenarien, in denen race conditions bei wiederholtem Zugriff auf den Dateipfad vermieden werden sollen. Da die Funktion auf dem bereits geöffneten Handle arbeitet, spiegelt sie den aktuellen Zustand der Datei wider.
Auf Windows-Systemen sind einige Felder wie uid, gid und ino immer 0, da das Windows-Dateisystem diese Konzepte nicht unterstützt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $stream Pflicht | resource | Ein gültiges Datei-Handle, das z. B. durch fopen() geöffnet wurde. |
Rückgabewert
false zurückgegeben. Die wichtigsten assoziativen Schlüssel sind: dev, ino, mode, nlink, uid, gid, rdev, size, atime, mtime, ctime, blksize, blocks.Beispiele
Dateigröße nach dem Schreiben prüfen
<?php
$handle = fopen('/tmp/beispiel.txt', 'w+');
fwrite($handle, 'Hallo, Welt!');
$info = fstat($handle);
echo 'Dateigröße: ' . $info['size'] . ' Bytes' . PHP_EOL;
echo 'Letzte Änderung: ' . date('Y-m-d H:i:s', $info['mtime']) . PHP_EOL;
fclose($handle);
Dateiberechtigungen auslesen und formatieren
<?php
$handle = fopen('/tmp/beispiel.txt', 'r');
if ($handle === false) {
die('Datei konnte nicht geöffnet werden.');
}
$info = fstat($handle);
// Oktale Darstellung der Dateirechte
$modeOktal = sprintf('%o', $info['mode']);
echo 'Dateirechte (oktal): ' . $modeOktal . PHP_EOL;
echo 'Inode: ' . $info['ino'] . PHP_EOL;
echo 'Eigentümer-UID: ' . $info['uid'] . PHP_EOL;
fclose($handle);
Vergleich von fstat und stat nach Dateiänderung
<?php
$pfad = '/tmp/vergleich.txt';
$handle = fopen($pfad, 'w+');
fwrite($handle, str_repeat('x', 1024));
// fstat liefert aktuellen Stand über den offenen Handle
$fstatInfo = fstat($handle);
// stat liefert möglicherweise gecachte Werte
clearstatcache();
$statInfo = stat($pfad);
echo 'fstat Größe: ' . $fstatInfo['size'] . ' Bytes' . PHP_EOL;
echo 'stat Größe: ' . $statInfo['size'] . ' Bytes' . PHP_EOL;
fclose($handle);
// Wichtig · Fallstricke
Stat-Cache: Im Gegensatz zu stat() unterliegt fstat() nicht dem PHP-internen Stat-Cache. Bei stat() können veraltete Werte zurückgegeben werden, sofern kein clearstatcache() aufgerufen wird – bei fstat() entfällt dieses Problem.
Windows-Einschränkungen: Auf Windows-Systemen sind die Felder ino, uid und gid immer 0. Das Feld blksize liefert dort ebenfalls -1.
Netzwerk-Streams: Bei Netzwerk-Streams oder bestimmten Stream-Wrappern kann fstat() unvollständige oder leere Ergebnisse zurückliefern, da nicht alle Metadaten verfügbar sind.