【问题标题】:ZeroMQ, how to properly read message ignoring envelope?ZeroMQ,如何正确读取忽略信封的消息?
【发布时间】: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");
}

【问题讨论】:

    标签: php zeromq


    【解决方案1】:

    我从未使用过 PHP 0MQ API,但您似乎想使用 recvMulti 而不是 recvrecvMulti 返回数组中的每个消息帧。在您的情况下,您可以跳过元素 0 并从元素 1 获取“真实”消息。

    【讨论】:

      猜你喜欢
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多