Start · Sprachen · PHP · Referenz · ZMQSocket

ZMQSocket

Klasse

Repräsentiert einen ZeroMQ-Socket zum Senden und Empfangen von Nachrichten über verschiedene Kommunikationsmuster.

seit PHP 1.0.0 Kategorie: misc

Signatur

class ZMQSocket

Beschreibung

ZMQSocket ist die zentrale Klasse der PHP-ZMQ-Erweiterung und kapselt einen ZeroMQ-Socket, der zum asynchronen, nachrichtenbasierten Datenaustausch zwischen Prozessen, Threads oder Netzwerkteilnehmern verwendet wird. ZeroMQ unterstützt verschiedene Kommunikationsmuster wie Request/Reply, Publish/Subscribe, Push/Pull und Pair, die über Konstanten wie ZMQ::SOCKET_REQ, ZMQ::SOCKET_PUB usw. festgelegt werden.

Ein ZMQSocket-Objekt wird immer im Kontext einer ZMQContext-Instanz erzeugt. Sockets können sich an Endpunkte binden (bind()) oder sich mit bestehenden Endpunkten verbinden (connect()). Verbindungen können über TCP, IPC (Unix Domain Sockets) oder In-Process-Kommunikation (inproc) hergestellt werden.

Nachrichten werden mit send() und recv() gesendet bzw. empfangen. Mehrteilige Nachrichten (Multipart) lassen sich über sendmulti() und recvmulti() verarbeiten. Socket-Optionen wie Timeouts oder Puffergrössen können über setSockOpt() konfiguriert werden.

ZMQSocket eignet sich hervorragend für die Entwicklung verteilter Systeme, Message Queues, Event-Driven Architekturen und Microservice-Kommunikation in PHP, insbesondere in Kombination mit lang laufenden CLI-Prozessen.

Parameter

Name Typ Default Beschreibung
$context Pflicht ZMQContext Die ZMQContext-Instanz, in deren Rahmen der Socket betrieben wird. Der Kontext verwaltet I/O-Threads und den Socket-Lebenszyklus.
$type Pflicht int Der Socket-Typ als Konstante, z. B. ZMQ::SOCKET_REQ, ZMQ::SOCKET_REP, ZMQ::SOCKET_PUB, ZMQ::SOCKET_SUB, ZMQ::SOCKET_PUSH, ZMQ::SOCKET_PULL usw.
$persistent_id string|null null Optionale ID für persistente Sockets. Wird diese angegeben, bleibt der Socket über mehrere Anfragen (in persistent Memory) erhalten und muss nicht neu verbunden werden.
$on_new_socket callable|null null Optionaler Callback, der aufgerufen wird, wenn ein neuer persistenter Socket erstellt wird. Nützlich zur einmaligen Initialisierung (z. B. bind() oder connect()).

Beispiele

Request/Reply-Kommunikation (Server)

<?php
// Server: wartet auf Anfragen und sendet Antworten
$context = new ZMQContext();
$socket = new ZMQSocket($context, ZMQ::SOCKET_REP);
$socket->bind('tcp://127.0.0.1:5555');

while (true) {
    $message = $socket->recv();
    echo 'Empfangen: ' . $message . PHP_EOL;
    $socket->send('Antwort auf: ' . $message);
}
Empfangen: Hallo Server

Publish/Subscribe-Muster (Publisher)

<?php
// Publisher: sendet Nachrichten an alle Subscriber
$context = new ZMQContext();
$publisher = new ZMQSocket($context, ZMQ::SOCKET_PUB);
$publisher->bind('tcp://127.0.0.1:5556');

// Kurze Pause damit Subscriber verbinden können
sleep(1);

for ($i = 1; $i <= 5; $i++) {
    $publisher->send('news Nachricht Nummer ' . $i);
    echo 'Gesendet: Nachricht ' . $i . PHP_EOL;
    usleep(100000);
}
Gesendet: Nachricht 1 Gesendet: Nachricht 2 Gesendet: Nachricht 3 Gesendet: Nachricht 4 Gesendet: Nachricht 5

Persistenter Socket mit Callback

<?php
// Persistenter Socket: Verbindung bleibt über PHP-Requests erhalten (z. B. PHP-FPM)
$context = new ZMQContext(1, true); // persistent

$socket = new ZMQSocket(
    $context,
    ZMQ::SOCKET_PUSH,
    'worker-socket',
    function (ZMQSocket $socket) {
        // Wird nur beim ersten Erstellen aufgerufen
        $socket->connect('tcp://127.0.0.1:5557');
        echo 'Socket neu verbunden.' . PHP_EOL;
    }
);

$socket->send('Job-Daten: ' . json_encode(['task' => 'email', 'to' => 'test@example.com']));
echo 'Job gesendet.' . PHP_EOL;
Socket neu verbunden. Job gesendet.

// Wichtig · Fallstricke

Blocking-Verhalten: recv() und send() blockieren standardmässig, bis eine Nachricht verfügbar ist bzw. gesendet werden kann. Um nicht-blockierendes Verhalten zu aktivieren, kann die Option ZMQ::MODE_NOBLOCK als zweites Argument übergeben oder ZMQ::SOCKOPT_RCVTIMEO / ZMQ::SOCKOPT_SNDTIMEO via setSockOpt() gesetzt werden.

Fehlerbehandlung: Im Fehlerfall wirft ZMQSocket-Methoden ZMQSocketException-Ausnahmen. Diese sollten immer abgefangen werden, insbesondere bei Verbindungsfehlern oder Timeout-Situationen.

Thread-Sicherheit: ZeroMQ-Sockets sind nicht thread-sicher. Ein ZMQSocket-Objekt darf nicht zwischen mehreren PHP-Threads geteilt werden. Für Multi-Threading muss jeder Thread einen eigenen ZMQContext und eigene Sockets erstellen.

Voraussetzung: Die PHP-ZMQ-Erweiterung (pecl install zmq) sowie die native ZeroMQ-Bibliothek (libzmq) müssen installiert sein. Verfügbarkeit prüfen: extension_loaded('zmq').