Start · Sprachen · PHP · Referenz · eio_cancel

eio_cancel

Funktion

Bricht einen zuvor gestarteten <code>eio</code>-Request ab, sofern er noch nicht abgeschlossen wurde.

seit PHP 0.3.0 (PECL eio) Kategorie: io

Signatur

eio_cancel(resource $req): void

Beschreibung

eio_cancel() versucht, einen laufenden asynchronen I/O-Request, der mit einer der eio_*-Funktionen gestartet wurde, abzubrechen. Die Funktion erwartet das Request-Handle, das von der jeweiligen eio_*-Funktion (z. B. eio_read(), eio_write(), eio_open()) zurückgegeben wurde.

Das Abbrechen ist nur dann wirksam, wenn der Request noch nicht von der libeio-Bibliothek ausgeführt wurde. Wurde er bereits gestartet oder abgeschlossen, bleibt der Aufruf ohne Wirkung – der Callback wird in diesem Fall nicht aufgerufen. Ist der Abbruch erfolgreich, wird der Callback ebenfalls nicht ausgeführt.

Diese Funktion ist besonders nützlich, wenn lange laufende Operationen (wie das Lesen großer Dateien) aufgrund geänderter Programmlogik nicht mehr benötigt werden und Ressourcen eingespart werden sollen. Typische Anwendungsfälle sind Timeouts, Benutzerabbrüche oder das Beenden einer Event-Loop.

Die eio-Extension ist nicht standardmäßig in PHP enthalten und muss über PECL installiert werden. Sie ermöglicht vollständig nicht-blockierendes, asynchrones Dateisystem-I/O auf Basis der libeio-Bibliothek.

Parameter

Name Typ Default Beschreibung
$req Pflicht resource Das Request-Handle, das von einer eio_*-Funktion (z. B. eio_read(), eio_write()) zurückgegeben wurde und den abzubrechenden Request repräsentiert.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

Beispiele

Lese-Request nach kurzer Zeit abbrechen

<?php
// Event-Loop mit ev-Extension (typisches Szenario)
$fp = fopen('/dev/urandom', 'rb');

// Asynchronen Lese-Request starten
$req = eio_read(
    $fp,
    1024 * 1024, // 1 MB lesen
    0,
    EIO_PRI_DEFAULT,
    function ($data, $result) {
        // Wird NICHT aufgerufen, wenn eio_cancel() erfolgreich war
        echo "Gelesen: " . strlen($result) . " Bytes\n";
    }
);

// Request sofort wieder abbrechen (bevor libeio ihn verarbeitet)
if ($req) {
    eio_cancel($req);
    echo "Request wurde abgebrochen.\n";
}

// Event-Loop verarbeiten
eio_event_loop();

fclose($fp);
Request wurde abgebrochen.

Request mit Timeout abbrechen

<?php
// Gemeinsam mit der ev-Extension einen Timeout simulieren
$file = '/var/log/large_logfile.log';
$fd = eio_open(
    $file,
    EIO_O_RDONLY,
    0,
    EIO_PRI_DEFAULT,
    function ($data, $result) use (&$readReq) {
        if ($result < 0) {
            echo "Datei konnte nicht geöffnet werden.\n";
            return;
        }
        // Lese-Request starten und Handle merken
        $readReq = eio_read(
            $result,
            1024 * 512,
            0,
            EIO_PRI_DEFAULT,
            function ($data, $content) use ($result) {
                echo "Inhalt gelesen, Länge: " . strlen($content) . "\n";
                eio_close($result, EIO_PRI_DEFAULT, null);
            }
        );

        // Timeout: Request nach 2 s abbrechen
        $timer = new EvTimer(2.0, 0.0, function () use (&$readReq) {
            if ($readReq) {
                eio_cancel($readReq);
                echo "Lese-Timeout: Request abgebrochen.\n";
            }
        });
    }
);

eio_event_loop();
Lese-Timeout: Request abgebrochen.

// Wichtig · Fallstricke

Kein garantierter Abbruch: eio_cancel() kann den Request nur dann tatsächlich abbrechen, wenn er noch nicht von libeio an das Betriebssystem übergeben wurde. In jedem Fall wird der Callback nicht aufgerufen – weder mit einem Fehler noch mit einem Ergebnis. Das Programm muss daher ggf. eigene Aufräumlogik implementieren.

Ressourcen-Verwaltung: Wenn ein eio_open()-Request abgebrochen wird, bevor der File-Deskriptor zurückgegeben wurde, kann kein eio_close() mehr aufgerufen werden. Stellen Sie sicher, dass keine Ressourcen-Lecks entstehen.

PECL-Extension erforderlich: Die eio-Extension ist nicht Teil der PHP-Standardinstallation. Installation via pecl install eio. Verfügbarkeit nur unter Linux/Unix; Windows wird nicht unterstützt.