is_link()
Die Funktion is_link() prüft, ob ein gegebener Pfad ein symbolischer Link ist, und gibt true oder false zurück.
Was die Funktion is_link() bewirkt
Ein symbolischer Link (oder Symlink) ist eine spezielle Datei, die auf eine andere Datei oder ein Verzeichnis zeigt – ähnlich wie eine Verknüpfung. Die Funktion is_link() ist eine eingebaute PHP-Funktion, die angibt, ob ein bestimmter Pfad selbst ein symbolischer Link ist.
Sie gibt zurück:
true— wenn der Pfad existiert und ein symbolischer Link ist.false— wenn der Pfad eine reguläre Datei oder ein Verzeichnis ist, nicht existiert oder nicht gelesen werden kann.
Ein wichtiger Punkt, der häufig zu Verwechslungen führt: is_link() betrachtet den Pfad selbst, nicht das, worauf der Link zeigt. Ein Symlink, der auf eine reguläre Datei zeigt, wird von is_link() weiterhin als Link gemeldet, auch wenn is_file() für denselben Pfad ebenfalls true zurückgäbe (weil es dem Link zu seinem Ziel folgt).
Diese Seite behandelt die Syntax, ein vollständig ausführbares Beispiel, den häufigsten Fallstrick (den Stat-Cache) und wie sich is_link() von verwandten Dateisystem-Prüfungen unterscheidet.
Syntax
is_link(string $filename): bool$filename ist der zu prüfende Pfad. Die Funktion gibt einen booleschen Wert zurück.
Ein vollständiges, ausführbares Beispiel
Da ein Symlink selten unter einem fest kodierten Pfad existiert, ist der zuverlässigste Weg, is_link() in Aktion zu sehen, zunächst einen mit symlink() zu erstellen, ihn zu prüfen und anschließend aufzuräumen:
<?php
$target = tempnam(sys_get_temp_dir(), 'tgt'); // a real regular file
$link = sys_get_temp_dir() . '/my_symlink';
// Make sure we start clean, then create the symlink.
@unlink($link);
symlink($target, $link);
var_dump(is_link($link)); // bool(true) — the path is a symlink
var_dump(is_link($target)); // bool(false) — the target is a regular file
var_dump(is_file($link)); // bool(true) — is_file() follows the link
// Clean up.
unlink($link);
unlink($target);is_link($link) ist true, weil der Pfad der Symlink ist, während is_link($target) false ist, weil das Ziel eine gewöhnliche Datei ist. Beachten Sie, dass is_file($link) true ist – es löst den Link auf und testet das Ziel.
Der Stat-Cache-Fallstrick
PHP speichert die Ergebnisse von Dateisystemfunktionen wie is_link(), is_file() und file_exists() aus Leistungsgründen zwischen. Wenn Sie während desselben Skriptlaufs einen Symlink erstellen, löschen oder ersetzen und ihn dann erneut prüfen, erhalten Sie möglicherweise ein veraltetes Ergebnis. Rufen Sie clearstatcache() auf, um eine frische Prüfung zu erzwingen:
<?php
$link = sys_get_temp_dir() . '/cache_demo';
@unlink($link);
symlink(__FILE__, $link);
var_dump(is_link($link)); // bool(true)
unlink($link);
clearstatcache(); // without this, the next check may still say true
var_dump(is_link($link)); // bool(false)is_link() im Vergleich zu verwandten Funktionen
| Funktion | Gibt true zurück, wenn der Pfad… |
|---|---|
is_link() | ein symbolischer Link ist (folgt dem Link nicht) |
is_file() | eine reguläre Datei ist (folgt Links zum Ziel) |
is_dir() | ein Verzeichnis ist (folgt Links zum Ziel) |
file_exists() | das Ziel existiert (folgt Links) |
Um zu prüfen, wohin ein Link zeigt, verwenden Sie readlink(); um einen Pfad mit allen aufgelösten Symlinks zu ermitteln, verwenden Sie realpath().
Wann würde ich es verwenden?
- Deploy-Skripte, die einen
current-Symlink zwischen Release-Verzeichnissen wechseln und sicherstellen müssen, dass es sich tatsächlich um einen Link handelt, bevor er ersetzt wird. - Backup- oder Synchronisierungstools, die entscheiden müssen, ob der Link selbst oder die Datei, auf die er zeigt, kopiert werden soll.
- Sicherheitsprüfungen, die benutzerdefinierte Pfade ablehnen, die sich über Symlinks einschleichen, die außerhalb eines erlaubten Verzeichnisses zeigen.
Fazit
is_link() beantwortet eine präzise Frage: Ist dieser Pfad ein symbolischer Link? Es prüft den Pfad selbst, anstatt ihm zu folgen, gibt false für fehlende Pfade zurück und teilt sich den PHP-Stat-Cache – rufen Sie daher clearstatcache() auf, wenn Sie Links während eines Skripts ändern. Kombinieren Sie es mit is_file(), readlink() und realpath(), wenn Sie wissen müssen, worauf ein Link zeigt.