Start · Sprachen · PHP · Referenz · lstat

lstat

Funktion

Gibt Statusinformationen über eine Datei oder einen symbolischen Link zurück, ohne dem Link zu folgen.

seit PHP 4.0.0 Kategorie: io

Signatur

lstat(string $filename): array|false

Beschreibung

lstat() sammelt Metadaten (Größe, Zugriffszeiten, Berechtigungen usw.) über die angegebene Datei oder den angegebenen symbolischen Link. Im Gegensatz zu stat() folgt lstat() dem symbolischen Link nicht, sondern liefert Informationen über den Link selbst. Handelt es sich bei filename um eine reguläre Datei (kein Symlink), sind die Ergebnisse identisch mit denen von stat().

Das zurückgegebene Array enthält 26 Elemente – numerisch indiziert von 0 bis 12 sowie zusätzlich mit assoziativen Schlüsseln (z. B. dev, ino, mode, nlink, uid, gid, rdev, size, atime, mtime, ctime, blksize, blocks). Auf Windows-Systemen sind einige Felder (z. B. ino, uid, gid) immer 0.

lstat() ist besonders nützlich, wenn man prüfen möchte, ob ein Pfad ein symbolischer Link ist (z. B. über filetype() oder durch Vergleich des mode-Felds), oder wenn man die tatsächlichen Eigenschaften des Links (nicht des Ziels) benötigt. Die Funktion nutzt den internen Statistik-Cache von PHP; mit clearstatcache() lässt sich dieser leeren.

  • dev – Geräte-ID
  • ino – Inode-Nummer
  • mode – Dateimodus (Berechtigungen + Typ)
  • nlink – Anzahl der Hardlinks
  • uid – Benutzer-ID des Eigentümers
  • gid – Gruppen-ID des Eigentümers
  • size – Dateigröße in Bytes (für Symlinks: Länge des Zielpfads)
  • atime – Letzter Zugriffszeitpunkt (Unix-Timestamp)
  • mtime – Letzte Änderungszeit (Unix-Timestamp)
  • ctime – Letzte Statusänderung (Unix-Timestamp)

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur Datei oder zum symbolischen Link, über den Informationen gesammelt werden sollen.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein Array mit 26 Elementen (numerisch und assoziativ) zurück, das Statusinformationen enthält. Im Fehlerfall (z. B. Datei nicht gefunden oder fehlende Berechtigungen) wird false zurückgegeben und ein E_WARNING ausgelöst.

Beispiele

Unterschied zwischen lstat() und stat() bei einem Symlink

<?php
// Zieldatei und Symlink anlegen
file_put_contents('/tmp/ziel.txt', 'Hallo Welt');
symlink('/tmp/ziel.txt', '/tmp/link.txt');

$lstatInfo = lstat('/tmp/link.txt');
$statInfo  = stat('/tmp/link.txt');

echo 'lstat size (Link selbst): ' . $lstatInfo['size'] . PHP_EOL;
echo 'stat  size (Zieldatei):   ' . $statInfo['size']  . PHP_EOL;

// Typ prüfen
echo 'Typ via lstat: ' . filetype('/tmp/link.txt') . PHP_EOL; // link

// Aufräumen
unlink('/tmp/link.txt');
unlink('/tmp/ziel.txt');
lstat size (Link selbst): 13 stat size (Zieldatei): 10 Typ via lstat: link

Prüfen ob ein Pfad ein symbolischer Link ist

<?php
function istSymlink(string $pfad): bool {
    if (!file_exists($pfad) && !is_link($pfad)) {
        return false;
    }
    $info = lstat($pfad);
    if ($info === false) {
        return false;
    }
    // Bit 0120000 im mode-Feld kennzeichnet einen Symlink
    return ($info['mode'] & 0170000) === 0120000;
}

file_put_contents('/tmp/original.txt', 'Test');
symlink('/tmp/original.txt', '/tmp/verknuepfung.txt');

var_dump(istSymlink('/tmp/verknuepfung.txt')); // true
var_dump(istSymlink('/tmp/original.txt'));     // false

unlink('/tmp/verknuepfung.txt');
unlink('/tmp/original.txt');
bool(true) bool(false)

// Wichtig · Fallstricke

Statistik-Cache: PHP cached die Ergebnisse von lstat(), stat() und verwandten Funktionen. Wenn sich die Datei oder der Link zwischen zwei Aufrufen verändert hat, muss der Cache mit clearstatcache(true, $filename) geleert werden, damit aktuelle Daten abgerufen werden.

Windows: Auf Windows werden symbolische Links nur eingeschränkt unterstützt. Die Felder ino, uid und gid liefern immer 0. Das Verhalten von lstat() gegenüber stat() kann je nach Windows-Version abweichen.

Broken Symlinks: lstat() kann auch für defekte symbolische Links aufgerufen werden (Links, deren Ziel nicht existiert), da der Link selbst noch vorhanden ist. file_exists() hingegen gibt für defekte Symlinks false zurück, während is_link() true liefert.