Signatur
Beschreibung
stomp_subscribe() ist die prozedurale Variante der STOMP-Erweiterung und abonniert eine Nachrichtenwarteschlange oder ein Topic auf einem Message-Broker (z. B. ActiveMQ oder RabbitMQ). Nach dem erfolgreichen Aufruf können über stomp_read_frame() eingehende Nachrichten aus dem abonnierten Ziel gelesen werden.
Das STOMP-Protokoll (Simple Text Oriented Messaging Protocol) ermöglicht die Kommunikation zwischen PHP-Anwendungen und gängigen Message-Brokern. Ein Abonnement ist notwendig, um Nachrichten von einer bestimmten Queue oder einem Topic zu empfangen. Die destination folgt der Broker-spezifischen Konvention, z. B. /queue/meinQueue oder /topic/meinTopic.
Über den optionalen Parameter headers können zusätzliche STOMP-Header mitgegeben werden, etwa ack für den Bestätigungsmodus (auto, client) oder Selektor-Ausdrücke zur Filterung von Nachrichten. Bei Verwendung von ack: client muss jede empfangene Nachricht explizit mit stomp_ack() bestätigt werden.
Diese Funktion steht als objektorientierte Methode ebenfalls über Stomp::subscribe() zur Verfügung. Für neue Projekte wird die OOP-Variante empfohlen, da sie eine sauberere Fehlerbehandlung ermöglicht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $link Pflicht | resource | Eine aktive STOMP-Verbindungsressource, wie sie von stomp_connect() zurückgegeben wird. |
|
| $destination Pflicht | string | Das Ziel (Queue oder Topic), das abonniert werden soll. Der Pfad folgt der Broker-Konvention, z. B. /queue/bestellungen oder /topic/nachrichten. |
|
| $headers | array | [] | Optionale assoziative Array mit zusätzlichen STOMP-Headern, z. B. ['ack' => 'client', 'selector' => "type = 'order'"]. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler. Im Fehlerfall liefert stomp_error() weitere Informationen.Beispiele
Einfaches Abonnement einer Queue
<?php
// Verbindung zum Message-Broker herstellen
$link = stomp_connect('tcp://localhost:61613');
if (!$link) {
die('Verbindung fehlgeschlagen: ' . stomp_connect_error());
}
// Queue abonnieren
if (stomp_subscribe($link, '/queue/bestellungen')) {
echo "Abonnement erfolgreich." . PHP_EOL;
// Nachricht lesen (blockierend)
$frame = stomp_read_frame($link);
if ($frame) {
echo "Empfangene Nachricht: " . $frame['body'] . PHP_EOL;
}
} else {
echo "Fehler beim Abonnieren: " . stomp_error($link) . PHP_EOL;
}
stomp_unsubscribe($link, '/queue/bestellungen');
stomp_close($link);
Abonnement mit manuellem ACK-Modus
<?php
$link = stomp_connect('tcp://localhost:61613');
if (!$link) {
die('Verbindung fehlgeschlagen: ' . stomp_connect_error());
}
// Abonnement mit client-seitigem Bestätigungsmodus
$headers = [
'ack' => 'client',
'activemq.prefetchSize' => '1',
];
if (stomp_subscribe($link, '/queue/aufgaben', $headers)) {
echo "Abonnement mit ACK-Modus aktiv." . PHP_EOL;
$frame = stomp_read_frame($link);
if ($frame) {
echo "Verarbeite: " . $frame['body'] . PHP_EOL;
// Nachricht explizit bestätigen
stomp_ack($link, $frame);
echo "Nachricht bestätigt." . PHP_EOL;
}
}
stomp_unsubscribe($link, '/queue/aufgaben');
stomp_close($link);
// Wichtig · Fallstricke
Deprecation/Verfügbarkeit: Die STOMP-Erweiterung ist nicht im PHP-Core enthalten und muss separat über PECL installiert werden (pecl install stomp). Sie wird nicht mehr aktiv weiterentwickelt und gilt als veraltet. Für neue Projekte sollten Alternativen wie php-amqplib (für AMQP/RabbitMQ) in Betracht gezogen werden.
Blockierendes Lesen: stomp_read_frame() blockiert standardmäßig, bis eine Nachricht eintrifft. Für nicht-blockierendes Verhalten kann ein Read-Timeout über die Verbindungsoptionen gesetzt werden.
ACK-Modus: Wird der Header ack auf client gesetzt, muss jede empfangene Nachricht explizit mit stomp_ack() bestätigt werden, sonst bleibt sie im Broker als unbestätigt und wird erneut zugestellt.