Start · Sprachen · PHP · Referenz · stomp_subscribe

stomp_subscribe

Funktion

Registriert einen Listener (Abonnement) für ein angegebenes Ziel auf einer STOMP-Verbindung.

seit PHP 0.1.0 Kategorie: misc

Signatur

stomp_subscribe(resource $link, string $destination, array $headers = []): bool

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

Typ
bool
Beschreibung
Gibt 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 erfolgreich. Empfangene Nachricht: Bestellung #42

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);
Abonnement mit ACK-Modus aktiv. Verarbeite: Aufgabe #7 Nachricht bestätigt.

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