Signatur
Beschreibung
eio_grp_add() dient dazu, einen zuvor erstellten asynchronen I/O-Request ($req) einer Request-Gruppe ($grp) zuzuordnen. Request-Gruppen werden mit eio_grp() erzeugt und erlauben es, mehrere asynchrone Operationen logisch zu bündeln und gemeinsam zu verwalten.
Der Vorteil dieses Mechanismus liegt darin, dass der Gruppen-Callback erst aufgerufen wird, wenn alle in der Gruppe enthaltenen Requests abgeschlossen sind. So lassen sich komplexe asynchrone Workflows – beispielsweise das parallele Lesen mehrerer Dateien – übersichtlich steuern, ohne dass für jeden Request einzelne Synchronisierungslogik geschrieben werden muss.
Ein typischer Anwendungsfall ist das gleichzeitige Verarbeiten einer Liste von Dateien: Man erstellt die Gruppe, fügt für jede Datei einen eio_read()- oder eio_open()-Request per eio_grp_add() hinzu und reagiert im Gruppen-Callback auf das vollständige Ergebnis.
Hinweis: Die eio-Extension muss installiert und aktiviert sein. Sie steht in der Regel nur auf Unix-ähnlichen Systemen zur Verfügung und wird hauptsächlich im Zusammenhang mit Event-Loop-Bibliotheken wie libevent oder ReactPHP eingesetzt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $grp Pflicht | resource | Die Request-Gruppe, die mit eio_grp() erstellt wurde und der der Request hinzugefügt werden soll. |
|
| $req Pflicht | resource | Der asynchrone I/O-Request (z. B. erzeugt durch eio_read(), eio_write(), eio_open() etc.), der der Gruppe zugeordnet werden soll. |
Rückgabewert
Beispiele
Zwei Dateien parallel lesen mit einer Request-Gruppe
<?php
// Voraussetzung: eio-Extension ist installiert
$results = [];
// Gruppen-Callback: wird aufgerufen, wenn alle Requests fertig sind
$grp = eio_grp(function ($data) use (&$results) {
echo "Alle Dateien wurden gelesen:\n";
foreach ($results as $name => $content) {
echo "[$name]: " . strlen($content) . " Bytes\n";
}
eio_stop();
}, "Gruppe abgeschlossen");
// Ersten Read-Request erstellen und zur Gruppe hinzufügen
$req1 = eio_get_event_stream(); // Platzhalter – in echtem Code: eio_open() + eio_read()
$readReq1 = eio_read(
'/tmp/datei1.txt',
0,
1024,
EIO_PRI_DEFAULT,
function ($data, $result) use (&$results) {
$results['datei1.txt'] = $result;
}
);
eio_grp_add($grp, $readReq1);
// Zweiten Read-Request erstellen und zur Gruppe hinzufügen
$readReq2 = eio_read(
'/tmp/datei2.txt',
0,
1024,
EIO_PRI_DEFAULT,
function ($data, $result) use (&$results) {
$results['datei2.txt'] = $result;
}
);
eio_grp_add($grp, $readReq2);
// Event-Loop starten
eio_event_loop();
?>
Dynamisches Hinzufügen von Requests aus einem Array von Pfaden
<?php
$files = ['/tmp/a.txt', '/tmp/b.txt', '/tmp/c.txt'];
$contents = [];
$grp = eio_grp(function () use (&$contents) {
echo "Fertig! " . count($contents) . " Dateien verarbeitet.\n";
eio_stop();
});
foreach ($files as $path) {
$req = eio_read(
$path,
0,
4096,
EIO_PRI_DEFAULT,
function ($data, $result) use ($path, &$contents) {
$contents[$path] = $result;
},
null
);
eio_grp_add($grp, $req);
}
eio_event_loop();
?>
// Wichtig · Fallstricke
Plattform: Die eio-Extension ist primär für Unix/Linux-Systeme konzipiert und steht unter Windows nicht zur Verfügung.
Reihenfolge: Requests innerhalb einer Gruppe werden nicht zwingend in der Reihenfolge ausgeführt, in der sie hinzugefügt wurden. Der Gruppen-Callback wird erst ausgelöst, wenn alle enthaltenen Requests abgeschlossen sind – unabhängig von ihrer Ausführungsreihenfolge.
Ressourcenverwaltung: Wenn ein Request zu einer Gruppe hinzugefügt wird, übernimmt die Gruppe die Verantwortung für dessen Lebenszeit. Das separate Abbrechen eines Gruppen-Requests via eio_cancel() kann unerwartetes Verhalten hervorrufen.