Signatur
Beschreibung
eio_link() erzeugt asynchron einen Hardlink für eine bestehende Datei. Ein Hardlink ist ein zusätzlicher Verzeichniseintrag, der auf dieselben Inode-Daten zeigt wie die Originaldatei. Änderungen an der Datei sind über beide Pfade sichtbar, und die Datei wird erst vom Dateisystem entfernt, wenn der letzte Hardlink gelöscht wird.
Die Funktion arbeitet nicht-blockierend und ist Teil der eio-Erweiterung, die auf libeio basiert. Sie eignet sich besonders für I/O-intensive Anwendungen oder Event-Loop-basierte Architekturen (z. B. mit event oder libevent), bei denen blockierende Dateisystemoperationen vermieden werden sollen.
Der Rückgabewert ist eine Anfrage-Ressource, über die der Request ggf. abgebrochen werden kann. Das Ergebnis der Operation wird im $callback geliefert; dort sollte geprüft werden, ob die Operation erfolgreich war.
Hardlinks funktionieren nur innerhalb desselben Dateisystems und können nicht auf Verzeichnisse angewendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $path Pflicht | string | Pfad zur bestehenden Quelldatei, für die der Hardlink erzeugt werden soll. | |
| $new_path Pflicht | string | Ziel-Pfad des neuen Hardlinks. Dieser Pfad darf noch nicht existieren. | |
| $pri | int | EIO_PRI_DEFAULT | Priorität der Anfrage. Mögliche Werte: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX. |
| $callback | callable | NULL | Callback-Funktion, die nach Abschluss der Operation aufgerufen wird. Signatur: callback(mixed $data, int $result, resource $req). $result ist 0 bei Erfolg, andernfalls -1. |
| $data | mixed | NULL | Beliebige Nutzerdaten, die unverändert an den $callback weitergegeben werden. |
Rückgabewert
false.Beispiele
Hardlink asynchron erstellen
<?php
$original = '/tmp/meine_datei.txt';
file_put_contents($original, 'Hallo Welt!');
$link = '/tmp/meine_datei_hardlink.txt';
eio_link($original, $link, EIO_PRI_DEFAULT, function($data, $result, $req) {
if ($result === 0) {
echo "Hardlink erfolgreich erstellt.\n";
echo file_get_contents('/tmp/meine_datei_hardlink.txt') . "\n";
} else {
echo "Fehler beim Erstellen des Hardlinks: " . eio_get_last_error($req) . "\n";
}
});
eio_event_loop();
?>
Hardlink mit Nutzerdaten im Callback
<?php
$original = '/tmp/quelldatei.txt';
file_put_contents($original, 'PHP eio Test');
$linkPath = '/tmp/quelldatei_link.txt';
$context = ['original' => $original, 'link' => $linkPath];
eio_link($original, $linkPath, EIO_PRI_DEFAULT, function($data, $result, $req) {
if ($result === 0) {
echo "Hardlink von '{$data['original']}' nach '{$data['link']}' erstellt.\n";
// Beide Pfade zeigen auf denselben Inode
$stat1 = stat($data['original']);
$stat2 = stat($data['link']);
echo 'Gleicher Inode: ' . ($stat1['ino'] === $stat2['ino'] ? 'Ja' : 'Nein') . "\n";
} else {
echo "Fehler: " . eio_get_last_error($req) . "\n";
}
}, $context);
eio_event_loop();
?>
// Wichtig · Fallstricke
Hardlinks sind auf Dateien beschränkt: Verzeichnisse können in den meisten Systemen nicht per Hardlink verknüpft werden. Für verzeichnisübergreifende oder betriebssystemübergreifende Verknüpfungen sollte eio_symlink() (symbolischer Link) verwendet werden.
Dateisystemgrenze: Hardlinks können nur innerhalb desselben Dateisystems erzeugt werden. Versuche über Dateisystemgrenzen hinweg schlagen mit einem Fehler fehl (EXDEV).
Die eio-Erweiterung muss explizit installiert und aktiviert sein (pecl install eio). Sie ist nicht standardmäßig in PHP enthalten. eio_event_loop() muss aufgerufen werden, damit ausstehende Anfragen verarbeitet werden.