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