Start · Sprachen · PHP · Referenz · eio_readlink

eio_readlink

Funktion

Liest asynchron den Wert (Ziel) eines symbolischen Links und ruft nach Abschluss die Callback-Funktion auf.

seit PHP 0.1.0 Kategorie: io

Signatur

eio_readlink(string $path, int $pri, callable $callback, mixed $data = null): resource|false

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

Typ
resource|false
Beschreibung
Gibt bei Erfolg eine EIO-Anfrage-Ressource zurück, mit der die Operation z. B. über 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
}
Symbolischer Link zeigt auf: /etc/hostname

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();
/tmp/link_a -> /var/log/syslog /tmp/link_b -> /etc/passwd

// 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.