Start · Sprachen · PHP · Referenz · is_link

is_link

Funktion

Prüft, ob der angegebene Pfad ein symbolischer Link (Symlink) ist.

seit PHP 4.0.0 Kategorie: io

Signatur

is_link(string $filename): bool

Beschreibung

is_link() gibt true zurück, wenn der übergebene Pfad auf einen symbolischen Link zeigt. Ein symbolischer Link (Symlink) ist eine spezielle Datei, die auf eine andere Datei oder ein Verzeichnis verweist. Die Funktion prüft dabei den Link selbst – nicht das Ziel des Links.

Typische Anwendungsfälle sind die Dateisystem-Inspektion, z. B. beim Durchsuchen von Verzeichnissen, beim Aufspüren von Symlinks in Deployment-Prozessen oder beim sicheren Umgang mit Dateipfaden, um unerwartete Link-Strukturen zu erkennen.

Wichtig: Unter Windows ist is_link() erst ab PHP 7.1 zuverlässig nutzbar, da ältere PHP-Versionen auf Windows symbolische Links nicht korrekt erkennen. Auf Unix-Systemen funktioniert die Funktion seit jeher zuverlässig.

Die Ergebnisse von is_link() werden vom internen Stat-Cache zwischengespeichert. Wenn der Symlink während der Laufzeit erstellt oder gelöscht wird, sollte clearstatcache() aufgerufen werden, um veraltete Cache-Daten zu vermeiden.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Der Pfad zur zu prüfenden Datei oder zum Verzeichnis. Es wird geprüft, ob dieser Pfad selbst ein symbolischer Link ist.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn filename ein symbolischer Link ist, andernfalls false. Gibt ebenfalls false zurück, wenn der Pfad nicht existiert oder ein Fehler auftritt.

Beispiele

Einfache Prüfung eines symbolischen Links

<?php
$path = '/var/www/html/current';

if (is_link($path)) {
    echo $path . ' ist ein symbolischer Link.';
    echo ' Er zeigt auf: ' . readlink($path);
} else {
    echo $path . ' ist kein symbolischer Link.';
}
?>
/var/www/html/current ist ein symbolischer Link. Er zeigt auf: /var/www/releases/v2.3.1

Symlinks in einem Verzeichnis auflisten

<?php
$dir = '/var/www/html';

foreach (new DirectoryIterator($dir) as $fileInfo) {
    if ($fileInfo->isDot()) {
        continue;
    }
    $fullPath = $dir . DIRECTORY_SEPARATOR . $fileInfo->getFilename();
    if (is_link($fullPath)) {
        echo 'Symlink gefunden: ' . $fileInfo->getFilename()
            . ' -> ' . readlink($fullPath) . PHP_EOL;
    }
}
?>
Symlink gefunden: current -> /var/www/releases/v2.3.1

Stat-Cache leeren nach Symlink-Erstellung

<?php
$link = '/tmp/mein_link';
$target = '/tmp/zieldatei.txt';

file_put_contents($target, 'Hallo Welt');
symlink($target, $link);

// Stat-Cache leeren, damit is_link() aktuelle Informationen liefert
clearstatcache();

if (is_link($link)) {
    echo 'Der Link wurde erfolgreich als Symlink erkannt.';
} else {
    echo 'Kein Symlink erkannt.';
}

unlink($link);
unlink($target);
?>
Der Link wurde erfolgreich als Symlink erkannt.

// Wichtig · Fallstricke

Windows-Kompatibilität: Auf Windows-Systemen erkennt is_link() symbolische Links erst ab PHP 7.1 zuverlässig. In älteren PHP-Versionen auf Windows gibt die Funktion immer false zurück, selbst wenn ein Symlink vorhanden ist.

Stat-Cache: PHP cached die Ergebnisse von Dateisystem-Funktionen wie is_link() intern. Wenn Links dynamisch erstellt oder entfernt werden, muss clearstatcache() aufgerufen werden, um veraltete Ergebnisse zu vermeiden.

Sicherheit: Bei der Verarbeitung von Benutzer-Eingaben als Pfade sollte sichergestellt werden, dass der Pfad validiert und kanonisiert wird (z. B. mit realpath()), um Path-Traversal-Angriffe zu verhindern. Beachte jedoch, dass realpath() Symlinks auflöst und daher das Ergebnis von is_link() beeinflusst.