(PECL zmq >= 0.5.0)
ZMQPoll::poll — 轮询项目
轮询当前轮询集中包含的项目。可读和可写项目在 readable
和 writable
参数中返回。 ZMQPoll::getLastErrors() 可用于检查是否有错误。
readable
返回可读 ZMQSockets/PHP 流的数组。数组将在操作开始时被清除。
writable
返回可写 ZMQSockets/PHP 流的数组。数组将在操作开始时被清除。
timeout
操作的超时时间。-1 表示轮询将等待直到至少有一个项目具有活动性。请注意,从 1.0.0 版本开始,轮询超时时间以毫秒定义,而不是微秒。
返回一个整数,表示具有活动性的项目的数量。
在错误时抛出 ZMQPollException。
示例 #1 一个 ZMQPoll() 示例
创建一个简单的轮询服务器
<?php
/* 创建套接字,请求-回复模式(回复套接字) */
$context = new ZMQContext();
$server = $context->getSocket(ZMQ::SOCKET_REP);
/* 绑定到 127.0.0.1 上的端口 5555 */
$server->bind("tcp://127.0.0.1:5555");
/* 为传入/传出消息创建新的轮询集 */
$poll = new ZMQPoll();
/* 添加对象并监听轮询输入/输出 */
$id = $poll->add($server, ZMQ::POLL_IN | ZMQ::POLL_OUT);
echo "添加了对象,ID 为 " . $id . "\n";
/* 初始化可读和可写数组 */
$readable = array();
$writable = array();
while (true) {
/* 获取的事件数量 */
$events = 0;
try {
/* 轮询直到有事情要做 */
$events = $poll->poll($readable, $writable, -1);
$errors = $poll->getLastErrors();
if (count($errors) > 0) {
foreach ($errors as $error) {
echo "轮询对象错误 " . $error . "\n";
}
}
} catch (ZMQPollException $e) {
echo "轮询失败: " . $e->getMessage() . "\n";
}
if ($events > 0) {
/* 循环遍历可读对象并接收消息 */
foreach ($readable as $r) {
try {
echo "接收到的消息: " . $r->recv() . "\n";
} catch (ZMQException $e) {
echo "recv 失败: " . $e->getMessage() . "\n";
}
}
/* 循环遍历可写对象并发送回消息 */
foreach ($writable as $w) {
try {
$w->send("Got it!");
} catch (ZMQException $e) {
echo "send 失败: " . $e->getMessage() . "\n";
}
}
}
}
?>