Start · Sprachen · PHP · Referenz · eio_grp_add

eio_grp_add

Funktion

Fügt einen einzelnen <code>eio</code>-Request zu einer bestehenden Request-Gruppe hinzu.

Kategorie: io

Signatur

eio_grp_add(resource $grp, resource $req): void

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

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

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();
?>
Alle Dateien wurden gelesen: [datei1.txt]: 42 Bytes [datei2.txt]: 87 Bytes

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();
?>
Fertig! 3 Dateien verarbeitet.

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