Start · Sprachen · PHP · Referenz · Stomp

Stomp

Klasse

Implementiert einen Client für das STOMP-Messaging-Protokoll zur Kommunikation mit Message-Brokern wie ActiveMQ oder RabbitMQ.

seit PHP 0.1.0 Kategorie: misc

Signatur

class Stomp

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;
}
Nachricht erfolgreich gesendet.

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;
}
Empfangene Bestellung: Array ( [bestell_id] => 42 [artikel] => PHP-Buch )

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;
}
Transaktion erfolgreich abgeschlossen.

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