Start · Sprachen · PHP · Referenz · readlink

readlink

Funktion

Liest das Ziel eines symbolischen Links und gibt den Pfad zurück, auf den der Link verweist.

seit PHP 4.0.0 Kategorie: io

Signatur

readlink(string $path): string|false

Beschreibung

readlink() liest den Inhalt eines symbolischen Links, d. h. den Pfad, auf den der Link zeigt. Dies entspricht dem Unix-Befehl readlink. Die Funktion ist nützlich, wenn Sie wissen möchten, auf welche Datei oder welches Verzeichnis ein Symlink letztlich verweist.

Der zurückgegebene Pfad ist der direkte Inhalt des Links – er muss nicht zwingend absolut sein. Wenn der Link auf einen relativen Pfad zeigt, wird auch ein relativer Pfad zurückgegeben. Um den echten, aufgelösten Zielpfad zu erhalten (einschließlich aller weiteren Symlinks in der Kette), sollte stattdessen realpath() verwendet werden.

Die Funktion ist besonders hilfreich bei Deployment-Workflows, die mit Symlinks arbeiten (z. B. Capistrano-artige Systeme), oder wenn Sie prüfen möchten, ob ein Symlink noch auf das richtige Ziel verweist.

Unter Windows ist diese Funktion ab PHP 5.3 verfügbar, jedoch mit eingeschränkter Unterstützung je nach Windows-Version und Berechtigungen.

Parameter

Name Typ Default Beschreibung
$path Pflicht string Der Dateisystempfad zum symbolischen Link, dessen Ziel ausgelesen werden soll.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den Pfad zurück, auf den der symbolische Link zeigt, oder false bei einem Fehler (z. B. wenn path kein symbolischer Link ist oder nicht existiert).

Beispiele

Einfaches Auslesen eines Symlinks

<?php
// Symbolischen Link anlegen (nur zur Demonstration)
symlink('/var/www/releases/v2.3.1', '/var/www/current');

$target = readlink('/var/www/current');

if ($target !== false) {
    echo 'Der Link zeigt auf: ' . $target;
} else {
    echo 'Fehler: Konnte Symlink nicht lesen.';
}
Der Link zeigt auf: /var/www/releases/v2.3.1

Prüfen, ob ein Symlink auf das erwartete Ziel zeigt

<?php
$linkPath    = '/var/www/current';
$expectedTarget = '/var/www/releases/v2.3.1';

if (!is_link($linkPath)) {
    echo 'Pfad ist kein symbolischer Link.';
} else {
    $actual = readlink($linkPath);
    if ($actual === $expectedTarget) {
        echo 'Deployment OK: Link zeigt auf die richtige Version.';
    } else {
        echo 'Warnung: Link zeigt auf ' . $actual . ' statt auf ' . $expectedTarget;
    }
}
Deployment OK: Link zeigt auf die richtige Version.

Unterschied zwischen readlink und realpath bei verschachtelten Symlinks

<?php
// /tmp/link_a -> /tmp/link_b -> /tmp/zieldatei.txt
// readlink gibt nur den direkten Link-Inhalt zurück:
$direct = readlink('/tmp/link_a');
echo 'readlink: ' . $direct . PHP_EOL;

// realpath löst alle Symlinks vollständig auf:
$resolved = realpath('/tmp/link_a');
echo 'realpath: ' . $resolved . PHP_EOL;
readlink: /tmp/link_b realpath: /tmp/zieldatei.txt

// Wichtig · Fallstricke

Plattformhinweis: Unter Windows erfordert das Lesen von Symlinks erhöhte Berechtigungen (SeBackupPrivilege oder Administratorrechte), da das Windows-Dateisystem Junction Points und Symlinks unterschiedlich behandelt.

Kein rekursives Auflösen: readlink() gibt nur den unmittelbaren Inhalt des Links zurück. Zeigt ein Symlink auf einen weiteren Symlink, wird dieser nicht weiter aufgelöst. Verwenden Sie realpath(), wenn Sie den vollständig aufgelösten Pfad benötigen.

Fehlerbehandlung: Die Funktion gibt false zurück und erzeugt eine PHP-Warnung, wenn path kein gültiger Symlink ist. Prüfen Sie mit is_link() vorab, ob es sich tatsächlich um einen symbolischen Link handelt.