Start · Sprachen · PHP · Referenz · link

link

Funktion

Erzeugt einen harten Link (<em>Hard Link</em>) vom Pfad <code>$link</code> auf das Ziel <code>$target</code>.

seit PHP 4.0.0 Kategorie: io

Signatur

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

Beschreibung

Die Funktion link() erstellt einen harten Link (Hard Link) im Dateisystem. Ein harter Link ist ein zusätzlicher Verzeichniseintrag, der auf denselben Inode (denselben Dateiinhalt) wie die Zieldatei zeigt. Beide Pfade – Original und Link – sind gleichwertig: Wird eine der Dateien bearbeitet, sehen beide Einträge dieselben Änderungen, da sie auf denselben physischen Speicherblock verweisen.

Im Gegensatz zu symbolischen Links (symlink()) existiert ein harter Link nur innerhalb desselben Dateisystems und desselben Datenträgers. Er kann nicht auf Verzeichnisse zeigen (auf den meisten Betriebssystemen). Wird die Originaldatei gelöscht, bleibt der harte Link weiterhin gültig, da der Inode erst freigegeben wird, wenn keine Verknüpfungen mehr darauf zeigen.

Typische Anwendungsfälle sind Backup-Strategien (z. B. inkrementelle Backups mit identischen Dateien, die nur einmal gespeichert werden), effizientes Deployment mehrerer Versionen einer Anwendung sowie allgemeine Situationen, in denen dieselbe Datei unter verschiedenen Namen oder in verschiedenen Verzeichnissen erreichbar sein soll, ohne Speicherplatz zu verschwenden.

Unter Windows ist link() ab PHP 5.3.0 verfügbar und setzt entsprechende Berechtigungen voraus. Unter Unix/Linux-Systemen sind in der Regel keine besonderen Privilegien notwendig, sofern der aufrufende Prozess Schreibrechte im Zielverzeichnis besitzt.

Parameter

Name Typ Default Beschreibung
$target Pflicht string Pfad zur bestehenden Datei, auf die der harte Link zeigen soll. Die Datei muss existieren und sich auf demselben Dateisystem befinden wie $link.
$link Pflicht string Pfad des zu erstellenden harten Links. Dieser Pfad darf noch nicht existieren; andernfalls schlägt die Funktion fehl.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der harte Link erfolgreich erstellt wurde. Bei einem Fehler (z. B. fehlendes Ziel, unzureichende Rechte, Link existiert bereits, verschiedene Dateisysteme) wird false zurückgegeben und ein Fehler der Stufe E_WARNING ausgelöst.

Beispiele

Einfachen harten Link erstellen

<?php
$target = '/var/www/data/original.txt';
$link   = '/var/www/data/hardlink.txt';

// Sicherstellen, dass die Zieldatei existiert
if (!file_exists($target)) {
    file_put_contents($target, 'Hallo, harter Link!');
}

if (link($target, $link)) {
    echo "Harter Link erfolgreich erstellt.\n";
    // Beide Pfade zeigen auf denselben Inode
    echo 'Inode Original: ' . fileinode($target) . "\n";
    echo 'Inode Link:     ' . fileinode($link)   . "\n";
} else {
    echo "Fehler: Harter Link konnte nicht erstellt werden.\n";
}
Harter Link erfolgreich erstellt. Inode Original: 123456 Inode Link: 123456

Inkrementelles Backup mit harten Links

<?php
/**
 * Erstellt ein inkrementelles Backup: Dateien, die sich nicht geändert haben,
 * werden als harte Links eingebunden, um Speicherplatz zu sparen.
 */
function inkrementelles_backup(string $quelle, string $ziel, string $vorheriges_backup): void
{
    if (!is_dir($ziel)) {
        mkdir($ziel, 0755, true);
    }

    foreach (new DirectoryIterator($quelle) as $datei) {
        if ($datei->isDot() || !$datei->isFile()) {
            continue;
        }

        $quelldatei  = $datei->getPathname();
        $zieldatei   = $ziel . DIRECTORY_SEPARATOR . $datei->getFilename();
        $vorher_datei = $vorheriges_backup . DIRECTORY_SEPARATOR . $datei->getFilename();

        if (file_exists($vorher_datei)
            && md5_file($quelldatei) === md5_file($vorher_datei)) {
            // Unveränderte Datei: harten Link zum vorherigen Backup erstellen
            link($vorher_datei, $zieldatei);
            echo "Hard-Link: {$datei->getFilename()}\n";
        } else {
            // Geänderte oder neue Datei: kopieren
            copy($quelldatei, $zieldatei);
            echo "Kopiert:   {$datei->getFilename()}\n";
        }
    }
}

inkrementelles_backup(
    '/var/www/app',
    '/backup/2024-06-02',
    '/backup/2024-06-01'
);
Hard-Link: config.php Kopiert: index.php Hard-Link: style.css

// Wichtig · Fallstricke

Plattformunterschiede: Unter Windows benötigt der PHP-Prozess die Berechtigung SeCreateSymbolicLinkPrivilege bzw. Administratorrechte, damit link() funktioniert. Unter Unix/Linux sind in der Regel nur Schreibrechte im Zielverzeichnis erforderlich.

Keine Verzeichnisse: Auf den meisten Betriebssystemen können harte Links nicht auf Verzeichnisse gesetzt werden (Ausnahme: Root unter bestimmten Unix-Systemen). Für Verzeichnis-Links muss symlink() verwendet werden.

Dateisystem-Grenze: Harte Links können nur innerhalb desselben Dateisystems erstellt werden. Ein Versuch über Dateisystemgrenzen hinweg schlägt mit einem E_WARNING fehl.

Linkzähler: Mit linkinfo() lässt sich der Inode prüfen, mit stat() der Referenzzähler (Feld nlink), der angibt, wie viele harte Links auf denselben Inode zeigen.