Signatur
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
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);
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);
// 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.