(PECL zmq >= 0.5.0)
ZMQSocket::recv — 接收消息
从套接字接收消息。默认情况下,接收将阻塞,直到有消息可用,除非使用 ZMQ::MODE_DONTWAIT
标志。ZMQ::SOCKOPT_RCVMORE
套接字选项可用于接收多部分消息。有关更多信息,请参见 ZMQSocket::setSockOpt()。
mode
传递模式标志以接收多部分消息或非阻塞操作。参见 ZMQ::MODE_*
常量。
返回消息。如果使用 ZMQ::MODE_DONTWAIT
,并且操作会阻塞,则将返回 false
。
在发生错误时抛出 ZMQSocketException。
示例 #1 发送/接收示例
非阻塞发送 / 接收
<?php
/* 创建新的队列对象,另一端需要有一个服务器 */
$queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ);
$queue->connect("tcp://127.0.0.1:5555");
/* 将套接字 1 分配给队列,发送和接收 */
$retries = 5;
$sending = true;
/* 启动循环 */
do {
try {
/* 尝试发送 / 接收 */
if ($sending) {
echo "Sending message\n";
$queue->send("This is a message", ZMQ::MODE_DONTWAIT);
$sending = false;
} else {
echo "Got response: " . $queue->recv(ZMQ::MODE_DONTWAIT) . "\n";
break;
}
} catch (ZMQSocketException $e) {
/* EAGAIN 表示操作会阻塞,重试 */
if ($e->getCode() === ZMQ::ERR_EAGAIN) {
echo " - Got EAGAIN, retrying ($retries)\n";
} else {
die(" - Error: " . $e->getMessage());
}
}
/* 在操作之间睡眠一下 */
usleep(5);
} while (--$retries);
?>
上面的示例将输出类似于
Sending message - Unable to execute operation, retrying (4) Got response: This is a message