Start · Sprachen · PHP · Referenz · ZMQDevice

ZMQDevice

Klasse

Repräsentiert ein ZeroMQ-Gerät zur Vermittlung von Nachrichten zwischen zwei Sockets (z. B. als Queue oder Forwarder).

Kategorie: misc

Signatur

class ZMQDevice

Beschreibung

ZMQDevice ist Teil der PHP-ZMQ-Erweiterung und implementiert ein sogenanntes Device – eine Vermittlungskomponente im ZeroMQ-Messaging-Muster. Ein Device nimmt Nachrichten von einem Frontend-Socket entgegen und leitet sie an einen Backend-Socket weiter. Typische Anwendungsfälle sind Lastverteilung (Queue Device), Publish/Subscribe-Weiterleitungen (Forwarder) oder Stream-Gateways (Streamer).

Das Gerät läuft üblicherweise in einer blockierenden Endlosschleife (run()), bis ein Fehler auftritt oder das Gerät manuell über einen Timer gestoppt wird. Es ist das PHP-Äquivalent zu zmq_proxy() aus der nativen ZMQ-Bibliothek.

Mit der optionalen Timerfunktion (setTimerCallback()) lässt sich periodisch eigener Code ausführen, während das Gerät aktiv ist – zum Beispiel für Überwachung, Heartbeats oder gesteuertes Beenden. Über setIdleCallback() kann Code ausgeführt werden, wenn keine Nachrichten zu verarbeiten sind.

Hinweis: Für den Einsatz von ZMQDevice muss die PECL-Erweiterung zmq installiert sein. Die Klasse eignet sich vor allem für langlebige Prozesse (z. B. als Daemon), nicht für klassische Web-Requests.

Parameter

Name Typ Default Beschreibung
$frontend Pflicht ZMQSocket Der Frontend-Socket, über den Nachrichten empfangen werden (z. B. ein ROUTER- oder PULL-Socket).
$backend Pflicht ZMQSocket Der Backend-Socket, an den Nachrichten weitergeleitet werden (z. B. ein DEALER- oder PUSH-Socket).
$capture ZMQSocket|null null Optionaler Capture-Socket, an den alle weitergeleiteten Nachrichten zusätzlich gesendet werden (z. B. für Logging oder Monitoring). null deaktiviert das Capturing.

Beispiele

Einfaches Queue-Device (ROUTER ↔ DEALER)

<?php
// Queue-Device: verteilt Arbeit von mehreren Clients an mehrere Worker
$context = new ZMQContext();

// Frontend: nimmt Anfragen von Clients entgegen
$frontend = new ZMQSocket($context, ZMQ::SOCKET_ROUTER);
$frontend->bind('tcp://*:5559');

// Backend: leitet Aufgaben an Worker weiter
$backend = new ZMQSocket($context, ZMQ::SOCKET_DEALER);
$backend->bind('tcp://*:5560');

// Device starten (blockiert, bis ein Fehler auftritt)
$device = new ZMQDevice($frontend, $backend);
$device->run();

Device mit Timer-Callback (periodisches Beenden nach Ablauf)

<?php
$context = new ZMQContext();

$frontend = new ZMQSocket($context, ZMQ::SOCKET_PULL);
$frontend->bind('tcp://*:5561');

$backend = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$backend->bind('tcp://*:5562');

$device = new ZMQDevice($frontend, $backend);

$startTime = time();

// Timer-Callback alle 1000 ms aufrufen
// Rückgabe false beendet das Device
$device->setTimerCallback(function () use ($startTime) {
    if (time() - $startTime >= 30) {
        echo "Device nach 30 Sekunden gestoppt." . PHP_EOL;
        return false; // Device beenden
    }
    return true; // weiterlaufen
}, 1000);

$device->run();
echo "Device wurde beendet." . PHP_EOL;
Device nach 30 Sekunden gestoppt. Device wurde beendet.

// Wichtig · Fallstricke

Blockierender Betrieb: run() blockiert den gesamten PHP-Prozess. ZMQDevice sollte daher ausschließlich in CLI-Skripten verwendet werden, die als dedizierter Daemon/Proxy-Prozess laufen – niemals in einem HTTP-Request-Handler.

Fehlerbehandlung: Bei einem Fehler wird eine ZMQDeviceException geworfen. Diese sollte abgefangen werden, um das Gerät sauber neu starten zu können.

Kompatibilität: Die genaue API (insbesondere setTimerCallback() und setIdleCallback()) kann je nach installierter Version der PECL-Erweiterung variieren. Prüfe die Version mit phpinfo() oder pecl list.