Signatur
Beschreibung
eio_readlink() ist Teil der EIO-Erweiterung, die asynchrone I/O-Operationen über die libeio-Bibliothek bereitstellt. Die Funktion entspricht dem POSIX-Systemaufruf readlink(2), führt diesen jedoch nicht-blockierend in einem separaten Thread aus, sodass der PHP-Prozess während der Operation weiterläuft.
Das Ergebnis wird über die $callback-Funktion bereitgestellt, die mit den Parametern ($data, $result, $req) aufgerufen wird: $data ist der an die Funktion übergebene benutzerdefinierte Wert, $result enthält bei Erfolg den aufgelösten Pfad des symbolischen Links als String oder -1 im Fehlerfall.
Die Funktion eignet sich besonders für Server-Anwendungen oder Daemons, die viele Dateisystem-Operationen gleichzeitig ausführen müssen, ohne dabei durch blockierende Systemaufrufe ausgebremst zu werden. Zusammen mit einer Event-Loop (z. B. über eio_event_loop()) lassen sich mehrere asynchrone Anfragen parallel abarbeiten.
Die EIO-Erweiterung muss explizit installiert und aktiviert sein (PECL). In PHP 8+ kann alternativ die Fiber- oder Amp-basierte Lösung sinnvoller sein.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $path Pflicht | string | Pfad zum symbolischen Link, dessen Ziel ausgelesen werden soll. | |
| $pri Pflicht | int | Priorität der Anfrage. Mögliche Werte: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX. Gibt an, wie dringend die Operation relativ zu anderen EIO-Anfragen abgearbeitet werden soll. |
|
| $callback Pflicht | callable | Callback-Funktion, die nach Abschluss der Operation aufgerufen wird. Signatur: function(mixed $data, string|int $result, resource $req): void. $result enthält den aufgelösten Pfad des Links oder -1 bei einem Fehler. |
|
| $data | mixed | null | Beliebige benutzerdefinierte Daten, die unverändert an die Callback-Funktion übergeben werden. Nützlich, um Kontext (z. B. Anfrage-IDs) mitzuführen. |
Rückgabewert
eio_cancel() abgebrochen werden kann. Im Fehlerfall wird false zurückgegeben.Beispiele
Ziel eines symbolischen Links asynchron auslesen
<?php
// Voraussetzung: EIO-Extension ist installiert (PECL)
$symlink = '/tmp/mylink'; // Muss ein vorhandener symbolischer Link sein
// Symbolischen Link anlegen (nur für das Beispiel)
if (!file_exists($symlink)) {
symlink('/etc/hostname', $symlink);
}
$req = eio_readlink(
$symlink,
EIO_PRI_DEFAULT,
function (mixed $data, mixed $result, $req) {
if ($result === -1) {
echo 'Fehler beim Lesen des Links: ' . eio_get_last_error($req) . PHP_EOL;
} else {
echo 'Symbolischer Link zeigt auf: ' . $result . PHP_EOL;
}
},
'mein-kontext'
);
if ($req === false) {
echo 'eio_readlink() konnte nicht gestartet werden.' . PHP_EOL;
} else {
eio_event_loop(); // Wartet, bis alle ausstehenden EIO-Anfragen abgeschlossen sind
}
Mehrere symbolische Links parallel auflösen
<?php
$links = [
'/tmp/link_a' => '/var/log/syslog',
'/tmp/link_b' => '/etc/passwd',
];
// Links anlegen (nur zu Demonstrationszwecken)
foreach ($links as $link => $target) {
if (!file_exists($link)) {
symlink($target, $link);
}
}
$pending = count($links);
foreach ($links as $link => $target) {
eio_readlink(
$link,
EIO_PRI_DEFAULT,
function (mixed $data, mixed $result, $req) use (&$pending) {
if ($result !== -1) {
echo $data . ' -> ' . $result . PHP_EOL;
} else {
echo $data . ': Fehler!' . PHP_EOL;
}
$pending--;
},
$link
);
}
// Event-Loop läuft, bis alle Anfragen abgearbeitet sind
eio_event_loop();
// Wichtig · Fallstricke
Voraussetzung: Die EIO-Erweiterung muss über PECL installiert sein (pecl install eio). Sie ist kein Bestandteil der PHP-Standardinstallation.
Fehlerbehandlung: Im Fehlerfall liefert $result im Callback den Wert -1. Der genaue Fehlergrund kann mit eio_get_last_error($req) abgefragt werden.
Nicht für reguläre Dateien: eio_readlink() funktioniert ausschließlich mit symbolischen Links. Wird ein regulärer Pfad übergeben, schlägt die Operation fehl.
Thread-Sicherheit: Da EIO intern mit Threads arbeitet, sollten keine gemeinsamen Ressourcen (z. B. Datenbankverbindungen) ohne Synchronisierung zwischen Callbacks geteilt werden.