English | 简体中文 | 繁體中文
查询

ZMQPoll::poll()函数—用法及示例

「 等待指定的ZMQSocket对象上的事件 」


函数:ZMQPoll::poll()

适用版本:ZMQ extension 1.0.0及以上版本

用法: ZMQPoll::poll()函数用于等待指定的ZMQSocket对象上的事件。它将阻塞当前进程,直到满足指定的事件或超时。

语法: public static int ZMQPoll::poll ( array &$readable , array &$writable [, int $timeout = -1 ] )

参数:

  • $readable:一个引用类型的数组,用于存储可读事件的ZMQSocket对象。
  • $writable:一个引用类型的数组,用于存储可写事件的ZMQSocket对象。
  • $timeout:可选参数,表示等待事件的超时时间(以毫秒为单位)。默认值为-1,表示永远等待。

返回值: 该函数返回已发生事件的ZMQSocket对象的数量。

示例:

$context = new ZMQContext();
$socket1 = new ZMQSocket($context, ZMQ::SOCKET_PULL);
$socket1->bind("tcp://localhost:5555");

$socket2 = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$socket2->connect("tcp://localhost:5555");

$poll = new ZMQPoll();
$poll->add($socket1, ZMQ::POLL_IN);
$poll->add($socket2, ZMQ::POLL_OUT);

$readable = $writable = array();

while (true) {
    $poll->poll($readable, $writable);

    foreach ($readable as $socket) {
        $message = $socket->recv();
        echo "Received message: $message\n";
    }

    foreach ($writable as $socket) {
        $socket->send("Hello, World!");
        echo "Sent message\n";
    }

    $readable = $writable = array(); // 清空数组,准备下一次循环
}

在上面的示例中,我们创建了一个PULL类型的ZMQSocket对象和一个PUSH类型的ZMQSocket对象,并将它们绑定和连接到同一个地址。然后,我们使用ZMQPoll对象将这两个socket对象添加到事件监听列表中,并指定监听的事件类型(POLL_IN和POLL_OUT)。 在主循环中,我们调用ZMQPoll::poll()函数等待事件的发生。一旦有可读或可写事件发生,该函数将返回,并将发生事件的socket对象存储在$readable和$writable数组中。我们通过遍历这两个数组来处理相应的事件,接收和发送消息。

请注意,在每次循环结束后,我们需要清空$readable和$writable数组,以准备下一次循环中的事件监听。这样可以确保只处理当前循环中发生的事件。

以上示例是一个简单的异步通信模式的实现,通过使用ZMQPoll::poll()函数,我们可以同时监听多个socket对象的事件,实现高效的并发处理。

补充纠错
上一个函数: ZMQPoll::remove()函数
下一个函数: ZMQPoll::getLastErrors()函数
热门PHP函数
分享链接