【发布时间】:2019-12-29 13:36:02
【问题描述】:
我正在使用这个 ZeroMQ 模式:
我相信它被命名为Shared Queue (DEALER and ROUTER sockets)
我对 ZGuide 中包含的示例做了一些小改动:
- 发送
REQ后的客户端不等待回复 - 代理读取工作人员回复并在内部进行处理(无需将其打磨回客户端)
这很好用,唯一的问题是当代理打印工人的回复时,消息总是在前面
k�E}
# (an empty string)
我认为这是由于 ZeroMQ 消息信封造成的,但处理该问题的正确方法是什么,以便仅获取 真实消息?
client.php
<?php
$context = new ZMQContext();
// Socket to talk to server
$requester = new ZMQSocket($context, ZMQ::SOCKET_REQ);
$requester->connect("tcp://localhost:5559");
$msg = "Ciao ".strrev(uniqid());
echo "→ $msg\n";
$requester->send($msg);
broker.php
<?php
// Prepare our context and sockets
$context = new ZMQContext();
$frontend = new ZMQSocket($context, ZMQ::SOCKET_ROUTER);
$backend = new ZMQSocket($context, ZMQ::SOCKET_DEALER);
$frontend->bind("tcp://*:5559");
$backend->bind("tcp://*:5560");
// Initialize poll set
$poll = new ZMQPoll();
$poll->add($frontend, ZMQ::POLL_IN);
$poll->add($backend, ZMQ::POLL_IN);
$readable = $writeable = array();
// Switch messages between sockets
while (true) {
$events = $poll->poll($readable, $writeable);
foreach ($readable as $socket) {
if ($socket === $frontend) {
// Process all parts of the message
while (true) {
$message = $socket->recv();
// Multipart detection
$more = $socket->getSockOpt(ZMQ::SOCKOPT_RCVMORE);
$backend->send($message, $more ? ZMQ::MODE_SNDMORE : null);
if (!$more) {
break; // Last message part
}
}
} elseif ($socket === $backend) {
$message = $socket->recv();
echo "← $message\n";
}
}
}
worker.php
<?php
$context = new ZMQContext();
// Socket to talk to clients
$responder = new ZMQSocket($context, ZMQ::SOCKET_REP);
$responder->connect("tcp://localhost:5560");
while (true) {
// Wait for next request from client
$string = $responder->recv();
printf ("Received request: [%s]%s", $string, PHP_EOL);
// Do some 'work'
sleep(1);
// Send reply back to client
$responder->send("Hi $string");
}
【问题讨论】: