Start · Sprachen · PHP · Referenz · stomp_read_frame

stomp_read_frame

Funktion

Liest das nächste Frame vom STOMP-Server und gibt es als assoziatives Array zurück.

seit PHP 0.1.0 Kategorie: misc

Signatur

stomp_read_frame(resource $link): array|false

Beschreibung

stomp_read_frame() ist die prozedurale Variante der STOMP-Erweiterung und liest das nächste eingehende Frame von einer aktiven STOMP-Verbindung. Ein Frame besteht dabei aus einem Befehl (Command), optionalen Headern sowie einem optionalen Nachrichtenrumpf (Body).

Die Funktion wird typischerweise eingesetzt, nachdem man einen oder mehrere Topics bzw. Queues mit stomp_subscribe() abonniert hat, um eingehende Nachrichten entgegenzunehmen. Das zurückgegebene Array enthält die Schlüssel command, headers und body.

Die Funktion blockiert standardmäßig, bis ein Frame verfügbar ist oder ein Timeout auftritt. Mit stomp_set_read_timeout() lässt sich das Verhalten steuern, um ein nicht-blockierendes Lesen zu ermöglichen. Bei einem Fehler gibt die Funktion false zurück; den genauen Fehlertext liefert dann stomp_error().

Für eine objektorientierte Verwendung steht die Methode Stomp::readFrame() zur Verfügung, die identisch funktioniert.

Parameter

Name Typ Default Beschreibung
$link Pflicht resource Eine aktive STOMP-Verbindungsressource, wie sie von stomp_connect() zurückgegeben wird.

Rückgabewert

Typ
array|false
Beschreibung
Bei Erfolg ein assoziatives Array mit den Schlüsseln command (string), headers (array) und body (string). Bei einem Fehler oder Timeout wird false zurückgegeben.

Beispiele

Nachrichten von einer Queue empfangen

<?php
// Verbindung zum STOMP-Broker herstellen
$link = stomp_connect('tcp://localhost:61613');

if (!$link) {
    die('Verbindung fehlgeschlagen: ' . stomp_error($link));
}

// Queue abonnieren
stomp_subscribe($link, '/queue/test');

// Nächstes Frame lesen
$frame = stomp_read_frame($link);

if ($frame === false) {
    echo 'Fehler beim Lesen: ' . stomp_error($link);
} else {
    echo 'Befehl: ' . $frame['command'] . PHP_EOL;
    echo 'Body: '   . $frame['body']    . PHP_EOL;

    // Nachricht bestätigen (ACK)
    if (isset($frame['headers']['message-id'])) {
        stomp_ack($link, $frame['headers']['message-id']);
    }
}

stomp_close($link);
Befehl: MESSAGE Body: Hallo Welt

Mehrere Frames in einer Schleife lesen mit Timeout

<?php
$link = stomp_connect('tcp://localhost:61613');

if (!$link) {
    die('Verbindung fehlgeschlagen.');
}

// Lese-Timeout auf 2 Sekunden setzen
stomp_set_read_timeout($link, 2, 0);

stomp_subscribe($link, '/queue/nachrichten');

// Maximal 10 Frames verarbeiten
for ($i = 0; $i < 10; $i++) {
    $frame = stomp_read_frame($link);

    if ($frame === false) {
        echo 'Kein Frame empfangen (Timeout oder Fehler).' . PHP_EOL;
        break;
    }

    echo 'Frame ' . ($i + 1) . ': ' . $frame['body'] . PHP_EOL;

    if (isset($frame['headers']['message-id'])) {
        stomp_ack($link, $frame['headers']['message-id']);
    }
}

stomp_unsubscribe($link, '/queue/nachrichten');
stomp_close($link);
Frame 1: Nachricht A Frame 2: Nachricht B Kein Frame empfangen (Timeout oder Fehler).

// Wichtig · Fallstricke

Blockierendes Verhalten: Ohne gesetzten Timeout blockiert stomp_read_frame() den PHP-Prozess dauerhaft, bis ein Frame eintrifft. In Web-Umgebungen kann dies zu einem Timeout des HTTP-Requests führen. Die Funktion eignet sich daher eher für CLI-Skripte oder Queue-Worker.

ACK-Pflicht: Bei Subscriptions mit ack:client-Header müssen empfangene Frames explizit mit stomp_ack() bestätigt werden, da der Broker die Nachricht sonst als nicht zugestellt behandelt und sie erneut sendet.

Erweiterung: Die STOMP-Erweiterung (PECL) wird nicht mehr aktiv weiterentwickelt. Für neue Projekte empfiehlt sich der Einsatz einer reinen PHP-Bibliothek wie stomp-php/stomp-php via Composer.