Signatur
Beschreibung
eio_grp() erzeugt eine sogenannte Request-Gruppe, in die mehrere einzelne asynchrone I/O-Anfragen eingefügt werden können. Die Gruppe fungiert als Container: Der angegebene Callback wird erst ausgelöst, wenn alle in der Gruppe enthaltenen Anfragen abgeschlossen sind. Das ermöglicht die koordinierte Verarbeitung mehrerer paralleler I/O-Vorgänge.
Request-Gruppen sind besonders nützlich, wenn voneinander unabhängige Dateioperationen (z. B. mehrere Lesevorgänge) parallel ausgeführt werden sollen und erst danach eine gemeinsame Weiterverarbeitung stattfinden soll. Anstatt Abhängigkeiten manuell zu zählen oder zu verwalten, übernimmt die Gruppe diese Synchronisation automatisch.
Mit eio_grp_add() werden einzelne Requests (z. B. eio_read(), eio_write()) zur Gruppe hinzugefügt. Die Gruppe selbst wird wie ein normaler eio-Request behandelt und kann abgebrochen (eio_cancel()) oder priorisiert werden.
Die eio-Extension setzt eine ereignisbasierte Architektur voraus (z. B. zusammen mit libevent oder event-Extension) und ist nicht standardmäßig in PHP enthalten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callback Pflicht | callable | Eine Callback-Funktion, die aufgerufen wird, sobald alle in der Gruppe enthaltenen Anfragen abgeschlossen sind. Signatur: callback(mixed $data, mixed $result, resource $req): void. |
|
| $data | mixed | NULL | Beliebige benutzerdefinierte Daten, die beim Aufruf des Callbacks als erstes Argument übergeben werden. Nützlich, um Kontext oder Zustand an den Callback weiterzureichen. |
Rückgabewert
eio-Request-Ressource zurück, die die erzeugte Gruppe repräsentiert. Mit dieser Ressource können weitere Operationen wie eio_grp_add() oder eio_cancel() durchgeführt werden. Bei einem Fehler wird false zurückgegeben.Beispiele
Mehrere Dateien parallel lesen mit einer Request-Gruppe
<?php
// Voraussetzung: eio-Extension ist installiert und geladen
$results = [];
// Callback, der ausgeführt wird, wenn alle Gruppenmitglieder fertig sind
$grpCallback = function ($data, $result, $req) use (&$results) {
echo "Alle Lesevorgänge abgeschlossen.\n";
foreach ($results as $filename => $content) {
echo "$filename: " . strlen($content) . " Bytes gelesen\n";
}
};
// Gruppe erstellen
$grp = eio_grp($grpCallback, 'meine_gruppe');
// Anfragen zur Gruppe hinzufügen
foreach (['/tmp/datei1.txt', '/tmp/datei2.txt'] as $file) {
$req = eio_open(
$file,
EIO_O_RDONLY,
0,
EIO_PRI_DEFAULT,
function ($data, $result, $req) use ($grp, $file, &$results) {
if ($result >= 0) {
$readReq = eio_read(
$result,
1024,
0,
EIO_PRI_DEFAULT,
function ($data, $content, $req) use ($grp, $file, $result, &$results) {
$results[$file] = $content;
eio_close($result, EIO_PRI_DEFAULT, null, null);
}
);
eio_grp_add($grp, $readReq);
}
}
);
eio_grp_add($grp, $req);
}
eio_event_loop();
?>
Einfache Gruppe mit zwei parallelen Schreiboperationen
<?php
// Einfaches Beispiel: Zwei Dateien parallel schreiben
$grp = eio_grp(
function ($data, $result, $req) {
echo "Beide Schreibvorgänge erledigt. Kontext: $data\n";
},
'schreib-kontext'
);
foreach (['/tmp/out1.txt' => 'Inhalt A', '/tmp/out2.txt' => 'Inhalt B'] as $path => $content) {
$req = eio_open(
$path,
EIO_O_WRONLY | EIO_O_CREAT | EIO_O_TRUNC,
0644,
EIO_PRI_DEFAULT,
function ($data, $fd, $req) use ($grp, $content) {
if ($fd >= 0) {
$writeReq = eio_write(
$fd,
$content,
strlen($content),
0,
EIO_PRI_DEFAULT,
function ($data, $result, $req) use ($fd) {
eio_close($fd, EIO_PRI_DEFAULT, null, null);
}
);
eio_grp_add($grp, $writeReq);
}
}
);
eio_grp_add($grp, $req);
}
eio_event_loop();
?>
// Wichtig · Fallstricke
Installationsvoraussetzung: Die eio-Extension ist kein Bestandteil der PHP-Standardinstallation und muss separat über PECL installiert werden (pecl install eio).
Achtung: Requests müssen der Gruppe vor dem Ende des aktuellen Event-Loop-Durchlaufs hinzugefügt werden, da eine leere Gruppe sofort als abgeschlossen gilt und den Callback direkt auslöst.
Kombination mit Event-Loops: eio integriert sich typischerweise mit der event- oder libevent-Extension. eio_event_loop() ist nur für einfache, blockierende Szenarien geeignet.