Start · Sprachen · PHP · Referenz · stomp_has_frame

stomp_has_frame

Funktion

Prüft, ob auf einer STOMP-Verbindung ein Frame zum Lesen bereitsteht.

seit PHP 0.1.0 Kategorie: misc

Signatur

stomp_has_frame(resource $link): bool

Beschreibung

stomp_has_frame() ist die prozedurale Variante der STOMP-Erweiterung und gibt an, ob auf der übergebenen Verbindungs-Ressource ein Frame (eine Nachricht) verfügbar ist, ohne blockierend zu warten. Die Funktion entspricht der Methode Stomp::hasFrame() in der objektorientierten API.

Diese Funktion ist besonders nützlich, wenn man eine nicht-blockierende Schleife implementieren möchte, die prüft, ob neue Nachrichten vom Broker eingetroffen sind, bevor man tatsächlich mit stomp_read_frame() liest. Dadurch lässt sich vermeiden, dass das Programm blockiert, wenn kein Frame vorhanden ist.

Typische Einsatzgebiete sind Nachrichtenwarteschlangen mit STOMP-kompatiblen Brokern wie Apache ActiveMQ oder RabbitMQ, bei denen man asynchron oder zeitgesteuert auf eingehende Nachrichten reagieren möchte.

Parameter

Name Typ Default Beschreibung
$link Pflicht resource Eine gültige STOMP-Verbindungsressource, die zuvor mit stomp_connect() erzeugt wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn mindestens ein Frame zum Lesen bereitsteht, andernfalls false.

Beispiele

Nicht-blockierende Frame-Abfrage in einer Schleife

<?php
// Verbindung zum STOMP-Broker herstellen
$link = stomp_connect('tcp://localhost:61613');

if (!$link) {
    die('Verbindung fehlgeschlagen: ' . stomp_connect_error());
}

// Queue abonnieren
stomp_subscribe($link, '/queue/test');

// Nicht-blockierende Schleife, die auf Frames wartet
$maxIterations = 10;
for ($i = 0; $i < $maxIterations; $i++) {
    if (stomp_has_frame($link)) {
        $frame = stomp_read_frame($link);
        echo "Empfangene Nachricht: " . $frame['body'] . PHP_EOL;
    } else {
        echo "Kein Frame verfügbar, warte..." . PHP_EOL;
        sleep(1);
    }
}

stomp_unsubscribe($link, '/queue/test');
stomp_close($link);
Kein Frame verfügbar, warte... Empfangene Nachricht: Hallo Welt ...

Einsatz mit Timeout-Logik

<?php
$link = stomp_connect('tcp://localhost:61613');

if (!$link) {
    die('Verbindung fehlgeschlagen.');
}

stomp_subscribe($link, '/queue/bestellungen');

$timeout = time() + 30; // Maximal 30 Sekunden warten

while (time() < $timeout) {
    if (stomp_has_frame($link)) {
        $frame = stomp_read_frame($link);
        // Nachricht verarbeiten
        echo "Bestellung erhalten: " . $frame['body'] . PHP_EOL;
        // Nach der ersten Nachricht Schleife verlassen
        break;
    }
    usleep(200000); // 200 ms warten
}

stomp_close($link);
Bestellung erhalten: {"id":42,"artikel":"Laptop"}

// Wichtig · Fallstricke

Hinweis zur Erweiterung: Die STOMP-Erweiterung (pecl/stomp) ist eine PECL-Erweiterung und muss separat installiert werden. Ab neueren PHP-Versionen wird sie nicht mehr aktiv gepflegt; für Produktivumgebungen sollten modernere Alternativen wie die PHP-Bibliothek stomp-php über Composer in Betracht gezogen werden.

Blockierendes Verhalten: Ohne vorherigen Aufruf von stomp_has_frame() kann stomp_read_frame() blockieren, bis ein Frame eintrifft. Die Kombination beider Funktionen ermöglicht eine nicht-blockierende Verarbeitung.

Verbindungsressource: Es ist sicherzustellen, dass die übergebene Ressource gültig und die Verbindung aktiv ist, da andernfalls ein Fehler ausgelöst werden kann.