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