W3docs

symlink()

Die PHP-Funktion symlink() erstellt einen symbolischen Link. Sie ist nützlich für die Arbeit mit Dateien und Verzeichnissen in PHP-Skripten.

Einführung

In PHP erstellt die Funktion symlink() einen symbolischen Link (auch Symlink oder Soft Link genannt) — eine spezielle Datei, die als Zeiger auf eine andere Datei oder ein Verzeichnis fungiert. Anstatt Daten zu kopieren, ermöglicht ein Symlink, dass zwei Pfade auf dasselbe zugrunde liegende Ziel verweisen, sodass Änderungen über einen der Pfade dieselbe Datei betreffen.

Symlinks sind praktisch, wenn Sie einen stabilen, vorhersehbaren Pfad benötigen (z.B. current, das immer auf das neueste Release-Verzeichnis zeigt), dieselbe Datei unter mehreren Namen zugänglich machen möchten oder eine Konfigurationsdatei projektübergreifend teilen wollen, ohne sie zu duplizieren.

Dieser Artikel behandelt Syntax, Parameter, Rückgabewert, häufige Fallstricke und ausführbare Beispiele.

Ein symbolischer Link speichert einen Pfad zu seinem Ziel und keine Kopie der Daten. Dies unterscheidet ihn von einem Hard Link (erstellt mit link()), der direkt auf die Dateidaten auf der Festplatte zeigt:

  • Ein Symlink kann auf ein Verzeichnis zeigen und Dateisystemgrenzen überschreiten; wenn das Ziel gelöscht wird, wird der Symlink „hängend" (gebrochen).
  • Ein Hard Link funktioniert nur für Dateien auf demselben Dateisystem und hält die Daten auch nach dem Entfernen des ursprünglichen Namens am Leben.

Da ein Symlink nur einen Pfad enthält, kann dieser Pfad relativ (aufgelöst relativ zum Verzeichnis, in dem der Link liegt) oder absolut sein.

Syntax

symlink(string $target, string $link): bool
ParameterBeschreibung
$targetDer Pfad, auf den der Link zeigen soll. Muss noch nicht existieren — ein Symlink auf ein fehlendes Ziel ist einfach gebrochen, bis das Ziel erscheint.
$linkDer Pfad des neuen symbolischen Links, der erstellt werden soll. Sein übergeordnetes Verzeichnis muss existieren und beschreibbar sein.

symlink() gibt bei Erfolg true und bei Misserfolg false zurück (und gibt eine Warnung aus). Es schlägt fehl, wenn $link bereits existiert, wenn Sie keine Schreibberechtigung im Verzeichnis des Links haben oder wenn Symlinks auf der Plattform nicht unterstützt werden.

Dieses vollständige Beispiel erstellt eine Datei, verlinkt auf sie und beweist dann, dass der Link auf das Original zurückzeigt:

<?php
// Create the real file.
file_put_contents('example.txt', 'Hello from the target file');

// Create a symbolic link to it.
symlink('example.txt', 'example_link.txt');

// Reading through the link reads the target's contents.
echo file_get_contents('example_link.txt'), PHP_EOL;

// is_link() confirms the path is a symlink, readlink() reveals its target.
echo (is_link('example_link.txt') ? 'It is a link' : 'Not a link'), PHP_EOL;
echo 'Points to: ', readlink('example_link.txt'), PHP_EOL;

// Clean up: unlink() removes the link, not the target.
unlink('example_link.txt');
unlink('example.txt');

Ausgabe:

Hello from the target file
It is a link
Points to: example.txt

Das Lesen von example_link.txt gibt den Inhalt des Ziels zurück, is_link() erkennt, dass der Pfad ein Symlink ist, und readlink() gibt den gespeicherten Zielpfad zurück.

Beispiel 2: Den Rückgabewert prüfen

symlink() gibt false zurück (mit einer Warnung), wenn der Link bereits existiert oder das Verzeichnis nicht beschreibbar ist. Prüfen Sie daher immer das Ergebnis im echten Code:

<?php
if (@symlink('target.txt', 'link.txt')) {
    echo 'Symbolic link created successfully.';
} else {
    echo 'Failed to create symbolic link.';
}

Das @ unterdrückt die Warnung, sodass Sie den Fehler selbst behandeln können. Eine robuste Routine entfernt zuerst einen veralteten Link und überprüft das Ergebnis:

<?php
$target = 'config.php';
$link   = 'current-config.php';

if (is_link($link)) {
    unlink($link); // remove the old link before re-pointing it
}

if (symlink($target, $link)) {
    echo "Linked $link -> " . readlink($link);
} else {
    echo "Could not create link (check permissions).";
}

Relative vs. absolute Ziele

Ein relatives $target wird relativ zum Verzeichnis aufgelöst, das den Link enthält, nicht relativ zum aktuellen Arbeitsverzeichnis. Dies ist eine häufige Ursache für gebrochene Links:

<?php
// If the link lives in /var/www/app, this resolves to /var/www/shared/db.php
symlink('../shared/db.php', '/var/www/app/db.php');

// Absolute targets avoid the ambiguity entirely.
symlink('/var/www/shared/db.php', '/var/www/app/db.php');

Verwenden Sie einen absoluten Pfad, wenn der Link aus einem anderen Arbeitsverzeichnis erstellt werden könnte oder wenn er unabhängig davon funktionieren soll, von wo aus der Link gelesen wird.

Häufige Fallstricke

  • Der Linkpfad darf noch nicht existieren. Löschen oder aktualisieren Sie einen vorhandenen Link zuerst mit unlink(), da symlink() sonst fehlschlägt.
  • Windows erfordert erhöhte Rechte. Das Erstellen von Symlinks erfordert Administratorrechte oder den aktivierten Entwicklermodus.
  • Gebrochene (hängende) Links zeigen auf ein fehlendes Ziel. is_link() gibt weiterhin true zurück, aber file_exists() auf den Link gibt false zurück, da es dem Link zum fehlenden Ziel folgt.
  • Berechtigungen werden für das übergeordnete Verzeichnis des Links geprüft, das beschreibbar sein muss.

Fazit

Die Funktion symlink() bietet eine schlanke Möglichkeit, auf Dateien und Verzeichnisse zu verweisen, ohne Daten zu kopieren. Denken Sie daran, den Rückgabewert zu überprüfen, bei unklarem Arbeitsverzeichnis absolute Ziele zu bevorzugen und plattformspezifische Berechtigungsanforderungen zu berücksichtigen. Kombinieren Sie sie mit is_link(), readlink() und unlink(), um Links zu prüfen und zu verwalten, und lesen Sie die Übersicht zum PHP Filesystem für die weiterführende Datei-API.

Übungen

Übung
Was trifft laut der Informationen auf der bereitgestellten Webseite auf die symlink-Funktion in PHP zu?
Was trifft laut der Informationen auf der bereitgestellten Webseite auf die symlink-Funktion in PHP zu?
Was this page helpful?