Signatur
Beschreibung
ZMQDeviceException ist eine spezialisierte Ausnahme-Klasse der ZMQ-Erweiterung (ZeroMQ für PHP) und wird geworfen, wenn eine Operation auf einem ZMQDevice-Objekt fehlschlägt. Sie erbt von ZMQException und damit indirekt von Exception.
Ein ZMQDevice dient als Nachrichtenweiterleiter (z. B. Queue-Device, Forwarder, Streamer) zwischen ZMQ-Sockets. Typische Fehlerursachen sind ungültige Socket-Konfigurationen, fehlende Verbindungen oder Ressourcenprobleme beim Start des Geräts.
Mit den von Exception geerbten Methoden getMessage(), getCode() und getTrace() lassen sich Fehlerursache und Kontext analysieren. Der Fehlercode entspricht dabei in der Regel dem ZMQ-internen errno-Wert.
Beispiele
ZMQDevice starten und ZMQDeviceException abfangen
<?php
try {
$context = new ZMQContext();
// Frontend-Socket (empfängt Anfragen)
$frontend = new ZMQSocket($context, ZMQ::SOCKET_ROUTER);
$frontend->bind('tcp://127.0.0.1:5559');
// Backend-Socket (leitet Anfragen weiter)
$backend = new ZMQSocket($context, ZMQ::SOCKET_DEALER);
$backend->bind('tcp://127.0.0.1:5560');
// Device als Queue/Broker starten
$device = new ZMQDevice($frontend, $backend);
$device->run();
} catch (ZMQDeviceException $e) {
echo 'ZMQDevice-Fehler: ' . $e->getMessage() . PHP_EOL;
echo 'Fehlercode: ' . $e->getCode() . PHP_EOL;
} catch (ZMQException $e) {
echo 'Allgemeiner ZMQ-Fehler: ' . $e->getMessage() . PHP_EOL;
}
ZMQDevice mit Timer-Callback und Fehlerbehandlung
<?php
try {
$context = new ZMQContext();
$frontend = new ZMQSocket($context, ZMQ::SOCKET_PULL);
$frontend->bind('tcp://127.0.0.1:5561');
$backend = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$backend->bind('tcp://127.0.0.1:5562');
$device = new ZMQDevice($frontend, $backend);
// Idle-Callback alle 1000 ms
$device->setIdleTimeout(1000);
$device->setIdleCallback(function () {
echo 'Device läuft...' . PHP_EOL;
// Rückgabewert false beendet das Device
return true;
});
$device->run();
} catch (ZMQDeviceException $e) {
fprintf(STDERR, "ZMQDevice-Fehler [%d]: %s\n", $e->getCode(), $e->getMessage());
}
// Wichtig · Fallstricke
Erweiterung erforderlich: ZMQDeviceException steht nur zur Verfügung, wenn die PECL-Erweiterung zmq installiert und aktiviert ist. Sie ist nicht Teil der PHP-Standardinstallation.
Fehlercode: Der über getCode() zurückgegebene Wert entspricht dem ZMQ-internen Fehlercode (errno), der mit der C-Funktion zmq_strerror() aufgelöst werden kann. Typische Codes sind EINTR (durch Signal unterbrochen) oder ETERM (Context wurde beendet).
Hierarchie: ZMQDeviceException extends ZMQException extends Exception — es empfiehlt sich, immer spezifisch ZMQDeviceException vor ZMQException abzufangen, um gezielte Fehlerbehandlung zu ermöglichen.