Signatur
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
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 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();
// 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.