Signatur
Beschreibung
Die Klasse Stomp ist Teil der PECL-Erweiterung stomp und stellt einen vollständigen Client für das Simple (or Streaming) Text Oriented Message Protocol (STOMP) bereit. Mit STOMP können PHP-Anwendungen über eine einfache TCP-Verbindung mit Message-Brokern wie Apache ActiveMQ, RabbitMQ oder HornetQ kommunizieren.
Die Klasse ermöglicht das Verbinden mit einem Broker, das Senden und Empfangen von Nachrichten, das Abonnieren von Queues und Topics sowie das Verwalten von Transaktionen. STOMP ist protokollunabhängig und eignet sich besonders für heterogene Umgebungen, in denen verschiedene Sprachen und Plattformen miteinander kommunizieren müssen.
Typische Anwendungsfälle sind asynchrone Verarbeitung von Hintergrundaufgaben, Event-Driven-Architekturen, verteilte Systeme und Entkopplung von Diensten. Ein Nachrichtenproduzent sendet Nachrichten in eine Queue, während ein oder mehrere Konsumenten diese unabhängig abrufen und verarbeiten.
Hinweis: Die PECL-Erweiterung stomp muss separat installiert werden (pecl install stomp). Alternativ steht mit stomp_connect() eine prozedurale API zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $broker | string | tcp://localhost:61613 | URI des STOMP-Brokers, z. B. tcp://localhost:61613 oder ssl://broker.example.com:61614. |
| $username | string | Benutzername zur Authentifizierung beim Broker. | |
| $password | string | Passwort zur Authentifizierung beim Broker. | |
| $headers | array | [] | Zusätzliche STOMP-Header als assoziatives Array, die beim CONNECT-Frame mitgesendet werden. |
| $readTimeout | array | ini-Wert | Lese-Timeout als Array mit den Schlüsseln sec (Sekunden) und usec (Mikrosekunden), z. B. ['sec' => 5, 'usec' => 0]. |
Beispiele
Nachricht an eine Queue senden
<?php
try {
// Verbindung zum Broker herstellen
$stomp = new Stomp('tcp://localhost:61613', 'guest', 'guest');
// Nachricht an die Queue '/queue/bestellungen' senden
$stomp->send(
'/queue/bestellungen',
json_encode(['bestell_id' => 42, 'artikel' => 'PHP-Buch']),
['content-type' => 'application/json']
);
echo "Nachricht erfolgreich gesendet." . PHP_EOL;
// Verbindung trennen
unset($stomp);
} catch (StompException $e) {
echo "Fehler: " . $e->getMessage() . PHP_EOL;
}
Nachrichten aus einer Queue empfangen (abonnieren)
<?php
try {
$stomp = new Stomp('tcp://localhost:61613', 'guest', 'guest');
// Queue abonnieren
$stomp->subscribe('/queue/bestellungen', ['ack' => 'client']);
// Auf eingehende Nachrichten warten (maximal 5 Sekunden)
$stomp->setReadTimeout(5, 0);
if ($stomp->hasFrame()) {
$frame = $stomp->readFrame();
if ($frame !== false) {
$daten = json_decode($frame->body, true);
echo "Empfangene Bestellung: " . print_r($daten, true);
// Nachricht bestätigen (ACK)
$stomp->ack($frame);
}
} else {
echo "Keine Nachrichten in der Queue." . PHP_EOL;
}
// Abonnement beenden und Verbindung trennen
$stomp->unsubscribe('/queue/bestellungen');
unset($stomp);
} catch (StompException $e) {
echo "Fehler: " . $e->getMessage() . PHP_EOL;
}
Transaktion verwenden
<?php
try {
$stomp = new Stomp('tcp://localhost:61613', 'guest', 'guest');
// Transaktion starten
$stomp->begin('transaktion-001');
$stomp->send(
'/queue/auftraege',
'Auftrag A',
['transaction' => 'transaktion-001']
);
$stomp->send(
'/queue/auftraege',
'Auftrag B',
['transaction' => 'transaktion-001']
);
// Beide Nachrichten atomisch committen
$stomp->commit('transaktion-001');
echo "Transaktion erfolgreich abgeschlossen." . PHP_EOL;
unset($stomp);
} catch (StompException $e) {
// Bei Fehler zurückrollen
if (isset($stomp)) {
$stomp->abort('transaktion-001');
}
echo "Fehler: " . $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Installation: Die PECL-Erweiterung muss mit pecl install stomp installiert und in der php.ini mit extension=stomp.so (Linux) bzw. extension=stomp.dll (Windows) aktiviert werden.
SSL/TLS: Für verschlüsselte Verbindungen das Schema ssl:// in der Broker-URI verwenden und sicherstellen, dass die OpenSSL-Erweiterung aktiv ist.
ACK-Modi: Im Modus client müssen Nachrichten explizit mit $stomp->ack($frame) bestätigt werden. Ohne ACK gelten Nachrichten als nicht verarbeitet und werden erneut zugestellt. Im Modus auto gilt die Zustellung als automatisch bestätigt.
Fehlerbehandlung: Fehler werden als StompException geworfen. Immer in einem try/catch-Block arbeiten, um Verbindungsfehler sauber abzufangen.
Alternativen: Für modernere Projekte kann die PHP-Bibliothek stomp-php (Composer-Paket stomp-php/stomp-php) als Ersatz ohne PECL-Abhängigkeit verwendet werden.