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