Start · Sprachen · PHP · Referenz · symlink

symlink

Funktion

Erzeugt einen symbolischen Link <code>$link</code>, der auf <code>$target</code> zeigt.

seit PHP 4.0.0 Kategorie: io

Signatur

symlink(string $target, string $link): bool

Beschreibung

symlink() erstellt einen symbolischen Link (Symlink) im Dateisystem. Ein symbolischer Link ist eine spezielle Datei, die auf eine andere Datei oder ein Verzeichnis verweist. Im Unterschied zu einem Hard-Link kann ein Symlink auch auf nicht existierende Ziele oder Ziele auf einem anderen Dateisystem zeigen.

Typische Einsatzbereiche sind das Bereitstellen mehrerer Zugriffspfade auf dieselbe Ressource (z. B. versionierte Bibliotheken), das Erstellen von Deployment-Strukturen oder das Verwalten von Konfigurationsdateien. Unter Unix/Linux ist symlink() weit verbreitet; unter Windows ist die Funktion seit PHP 5.3 verfügbar, erfordert jedoch erhöhte Rechte oder den Entwicklermodus.

Ist am Zielpfad $link bereits eine Datei oder ein Link vorhanden, schlägt die Funktion fehl und gibt false zurück. Um einen bestehenden Symlink zu ersetzen, muss dieser zuerst mit unlink() entfernt werden. Das Ziel $target muss zum Zeitpunkt der Link-Erstellung nicht existieren (dangling symlink).

Relative Pfade in $target werden relativ zum Verzeichnis von $link aufgelöst – nicht relativ zum aktuellen Arbeitsverzeichnis des Scripts. Absolute Pfade sind daher in vielen Fällen sicherer und empfehlenswerter.

Parameter

Name Typ Default Beschreibung
$target Pflicht string Pfad, auf den der symbolische Link verweisen soll. Muss zum Zeitpunkt der Erstellung nicht existieren.
$link Pflicht string Pfad des neu zu erstellenden symbolischen Links im Dateisystem.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn $link bereits existiert, keine Schreibrechte vorhanden sind oder das Betriebssystem die Operation verweigert).

Beispiele

Einfachen Symlink auf eine Datei erstellen

<?php
$target = '/var/www/releases/v2.5.0';
$link   = '/var/www/current';

if (file_exists($link) || is_link($link)) {
    unlink($link); // bestehenden Link entfernen
}

if (symlink($target, $link)) {
    echo "Symlink erfolgreich erstellt: $link -> $target";
} else {
    echo "Fehler beim Erstellen des Symlinks.";
}
Symlink erfolgreich erstellt: /var/www/current -> /var/www/releases/v2.5.0

Symlink auf ein Verzeichnis für ein Deployment

<?php
$releasesDir = '/srv/app/releases';
$newRelease  = $releasesDir . '/2024-06-01_143000';
$currentLink = '/srv/app/current';

// Neues Release-Verzeichnis anlegen (Simulation)
if (!is_dir($newRelease)) {
    mkdir($newRelease, 0755, true);
}

// Alten Symlink entfernen
if (is_link($currentLink)) {
    unlink($currentLink);
}

// Neuen Symlink setzen
if (symlink($newRelease, $currentLink)) {
    echo "Deployment abgeschlossen. Aktuelles Release: " . readlink($currentLink);
} else {
    echo "Deployment fehlgeschlagen.";
}
Deployment abgeschlossen. Aktuelles Release: /srv/app/releases/2024-06-01_143000

// Wichtig · Fallstricke

Windows: Unter Windows benötigt symlink() Administratorrechte oder den aktivierten Windows-Entwicklermodus (ab Windows 10). Ohne diese Rechte schlägt die Funktion fehl. Zusätzlich wird zwischen Datei- und Verzeichnis-Symlinks unterschieden, was unter Unix nicht der Fall ist.

Sicherheit: Symlinks können in sicherheitsrelevanten Kontexten zu Path-Traversal-Angriffen missbraucht werden (Symlink-Attacken). Stellen Sie sicher, dass Nutzereingaben niemals unkontrolliert als $target oder $link verwendet werden. Prüfen Sie Pfade mit realpath() und Whitelist-Validierung.

Relative Pfade: Wird ein relativer Pfad als $target angegeben, bezieht er sich auf das Verzeichnis, in dem $link liegt – nicht auf das aktuelle Arbeitsverzeichnis. Dies kann zu schwer nachvollziehbaren Fehlern führen; absolute Pfade sind daher zu bevorzugen.

Mit is_link() lässt sich prüfen, ob ein Pfad ein symbolischer Link ist, und mit readlink() kann das Ziel eines Symlinks ausgelesen werden.