Start · Sprachen · PHP · Referenz · ZMQSocketException

ZMQSocketException

Klasse

Wird ausgelöst, wenn ein Fehler bei einer <code>ZMQSocket</code>-Operation auftritt, z. B. beim Verbinden, Senden oder Empfangen von Nachrichten.

Kategorie: error

Signatur

class ZMQSocketException extends ZMQException

Beschreibung

ZMQSocketException ist eine spezialisierte Ausnahmeklasse aus der ZMQ-Erweiterung (ZeroMQ für PHP). Sie wird geworfen, sobald eine Operation auf einem ZMQSocket-Objekt fehlschlägt – etwa wenn ein Socket nicht gebunden oder verbunden werden kann, eine Nachricht nicht gesendet werden kann oder ein ungültiger Socket-Typ angegeben wurde.

Die Klasse erbt von ZMQException, welche selbst von der eingebauten Exception-Klasse ableitet. Damit stehen alle Standard-Methoden wie getMessage(), getCode() und getTrace() zur Verfügung. Der Fehlercode entspricht in der Regel einem ZMQ-Fehlercode (errno), der detaillierten Aufschluss über die Ursache des Fehlers gibt.

Es empfiehlt sich, ZMQSocketException in einem try/catch-Block gezielt abzufangen, um robuste Messaging-Anwendungen zu schreiben. Da ZMQ-Sockets nicht Thread-sicher sind und viele netzwerkbezogene Fehler auftreten können, ist eine präzise Fehlerbehandlung auf Socket-Ebene besonders wichtig.

Im Vergleich zu ZMQContextException oder ZMQPollException ist ZMQSocketException auf Fehler beschränkt, die direkt an einem Socket entstehen – also beim Binden, Verbinden, Senden, Empfangen oder beim Setzen von Socket-Optionen.

Beispiele

Verbindungsfehler eines ZMQSocket abfangen

<?php
try {
    $context = new ZMQContext();
    $socket  = new ZMQSocket($context, ZMQ::SOCKET_REQ);

    // Ungültige Adresse, um einen Fehler zu provozieren
    $socket->connect('ungültige-adresse');
} catch (ZMQSocketException $e) {
    echo 'ZMQSocket-Fehler: ' . $e->getMessage() . PHP_EOL;
    echo 'Fehlercode: '      . $e->getCode()    . PHP_EOL;
}
ZMQSocket-Fehler: No such device Fehlercode: 19

Fehlerbehandlung beim Senden einer Nachricht

<?php
try {
    $context = new ZMQContext();
    $socket  = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
    $socket->bind('tcp://127.0.0.1:5555');

    // Senden ohne verbundenen Empfänger (non-blocking)
    $socket->send('Hallo ZeroMQ', ZMQ::MODE_NOBLOCK);
    echo 'Nachricht gesendet.' . PHP_EOL;
} catch (ZMQSocketException $e) {
    echo 'Fehler beim Senden: ' . $e->getMessage() . PHP_EOL;
    echo 'ZMQ-Fehlercode: '    . $e->getCode()    . PHP_EOL;
}
Fehler beim Senden: Resource temporarily unavailable ZMQ-Fehlercode: 11

// Wichtig · Fallstricke

Fehlercode-Interpretation: Der von getCode() zurückgegebene Wert entspricht dem systemeigenen errno-Wert, den ZeroMQ intern verwendet. Eine Übersicht der Fehlercodes findet sich in der ZeroMQ-API-Dokumentation.

Abgrenzung zu anderen ZMQ-Ausnahmen: Die ZMQ-Erweiterung kennt mehrere Ausnahmeklassen (ZMQContextException, ZMQSocketException, ZMQPollException, ZMQDeviceException). Es empfiehlt sich, diese gezielt – und nicht nur das gemeinsame ZMQException – abzufangen, um zwischen verschiedenen Fehlerquellen unterscheiden zu können.

Nicht-blockierender Modus: Bei Verwendung von ZMQ::MODE_NOBLOCK wird bei temporärer Nichtverfügbarkeit eine ZMQSocketException mit Fehlercode EAGAIN (11) geworfen, anstatt zu blockieren. Dies muss im Anwendungscode explizit behandelt werden.