Signatur
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
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";
}
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'
);
// 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.