Start · Sprachen · PHP · Referenz · ZMQ

ZMQ

Klasse

Stellt Konstanten und statische Hilfsmethoden der ZMQ-Erweiterung (ZeroMQ) bereit.

seit PHP 1.0.0 Kategorie: misc

Signatur

class ZMQ

Beschreibung

ZMQ ist die zentrale Einstiegsklasse der PHP-ZMQ-Erweiterung und bildet den Zugang zum ZeroMQ-Messaging-Framework. Sie selbst wird in der Regel nicht instanziiert, sondern dient primär als Namespace für die zahlreichen Konstanten (Socket-Typen, Optionen, Fehler-Codes usw.) sowie für statische Hilfsmethoden.

ZeroMQ ist ein asynchrones Messaging-Framework, das für hochperformante verteilte und parallele Anwendungen geeignet ist. Typische Einsatzbereiche sind Message-Queues, Publish/Subscribe-Systeme, Request/Reply-Kommunikation und Worker-Pools – alles ohne zentralen Message-Broker.

Die wichtigsten Konstanten der Klasse umfassen Socket-Typen wie ZMQ::SOCKET_PUB, ZMQ::SOCKET_SUB, ZMQ::SOCKET_REQ, ZMQ::SOCKET_REP, ZMQ::SOCKET_PUSH, ZMQ::SOCKET_PULL sowie Optionen für ZMQSocket::setSockOpt() wie ZMQ::SOCKOPT_LINGER, ZMQ::SOCKOPT_RCVTIMEO und viele mehr.

Für die eigentliche Kommunikation werden die verwandten Klassen ZMQContext, ZMQSocket und ZMQPoll verwendet. ZMQ selbst liefert dabei die Konfigurationswerte, die an diese Klassen übergeben werden.

Beispiele

Einfacher Request/Reply-Server mit ZMQ-Konstanten

<?php
// Server-Seite: empfängt Nachrichten und sendet Antworten
$context = new ZMQContext();

// ZMQ::SOCKET_REP = Reply-Socket-Typ (Konstante aus ZMQ)
$socket = new ZMQSocket($context, ZMQ::SOCKET_REP);
$socket->bind('tcp://127.0.0.1:5555');

echo "Server wartet auf Anfragen...\n";

while (true) {
    $message = $socket->recv();
    echo "Empfangen: " . $message . "\n";
    $socket->send('Antwort auf: ' . $message);
}
Server wartet auf Anfragen...

Publish/Subscribe mit ZMQ-Konstanten und Socket-Optionen

<?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');

// Kurz warten, damit Subscriber verbinden können
sleep(1);

for ($i = 1; $i <= 5; $i++) {
    $publisher->send('Nachricht Nr. ' . $i);
    echo "Gesendet: Nachricht Nr. " . $i . "\n";
}

// Subscriber-Seite (separat ausführen):
// $context    = new ZMQContext();
// $subscriber = new ZMQSocket($context, ZMQ::SOCKET_SUB);
// $subscriber->connect('tcp://127.0.0.1:5556');
// $subscriber->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, '');
// while (true) {
//     echo $subscriber->recv() . "\n";
// }
Gesendet: Nachricht Nr. 1 Gesendet: Nachricht Nr. 2 Gesendet: Nachricht Nr. 3 Gesendet: Nachricht Nr. 4 Gesendet: Nachricht Nr. 5

Nützliche ZMQ-Konstanten im Überblick

<?php
// Socket-Typen
echo ZMQ::SOCKET_PUB  . "\n"; // Publisher
echo ZMQ::SOCKET_SUB  . "\n"; // Subscriber
echo ZMQ::SOCKET_REQ  . "\n"; // Request
echo ZMQ::SOCKET_REP  . "\n"; // Reply
echo ZMQ::SOCKET_PUSH . "\n"; // Push (Pipeline)
echo ZMQ::SOCKET_PULL . "\n"; // Pull (Pipeline)
echo ZMQ::SOCKET_PAIR . "\n"; // Pair (1:1)

// Socket-Optionen
echo ZMQ::SOCKOPT_LINGER   . "\n"; // Linger-Zeit beim Schließen
echo ZMQ::SOCKOPT_RCVTIMEO . "\n"; // Empfangs-Timeout in ms
echo ZMQ::SOCKOPT_SNDTIMEO . "\n"; // Sende-Timeout in ms

// Wichtig · Fallstricke

Voraussetzung: Die ZMQ-PHP-Erweiterung (php-zmq) muss installiert und in der php.ini aktiviert sein. Zusätzlich wird die native libzmq-Bibliothek benötigt. Installation z. B. über PECL: pecl install zmq.

Versionierung: Die verfügbaren Konstanten hängen von der installierten libzmq-Version ab. Neuere ZMQ-Protokoll-Features (z. B. SOCKET_XPUB, SOCKET_XSUB, SOCKET_STREAM) sind nur ab bestimmten libzmq-Versionen verfügbar.

Thread-Sicherheit: ZMQContext-Objekte sind thread-sicher, ZMQSocket-Objekte hingegen dürfen nicht zwischen Threads geteilt werden. Jeder Thread benötigt eigene Socket-Objekte.

Linger-Option: Standardmäßig wartet ZMQ beim Schließen eines Sockets unbegrenzt auf das Zustellen gepufferter Nachrichten. Mit ZMQ::SOCKOPT_LINGER auf 0 setzen, um sofortiges Schließen zu erzwingen und Hänger zu vermeiden.