棘轮,获取客户关于连接关闭的主题

时间:2016-05-29 01:06:23

标签: php websocket ratchet

我正在使用棘轮来启用群聊的推送通知。

我决定做以下事情:

  • 每当用户连接时,请订阅他所参与的所有群组主题以及个人消息主题。

我有一个主题protected $subscribedTopics = array();主题,如棘轮教程中所述。

这样可行,但随着时间的推移,群组主题/用户主题的数量只会增加(无法从订阅的主题数组中删除这些主题)。

按照设计,我的应用程序不允许从客户端向服务器发送消息,也不允许用户取消订阅。它只能关闭连接

所以,我需要一种方法来获取用户订阅的所有主题,当他关闭时(我的逻辑是,如果他是某些主题的唯一订阅者,则从订阅主题数组中删除这些主题)< / p>

onClose方法是:

public function onClose(ConnectionInterface $conn) {
    echo "close";
}

我该怎么做?

1 个答案:

答案 0 :(得分:1)

关闭连接后,您仍需要取消订阅主题,以便将其从websocket中完全删除。

public function onClose(ConnectionInterface $conn) {
    foreach ($conn->Chat->rooms as $topic => $one) {
        $this->onUnSubscribe($conn, $topic);
    }
}

使用此代码,您可以在关闭连接时取消订阅$ topic

要使取消订阅工作,你需要类似的东西:

function onUnSubscribe(ConnectionInterface $conn, $topic) {
    unset($conn->rooms['topic']);
    $this->rooms[$topic]->detach($conn);
    if ($this->rooms[$topic]->count() == 0) {
        unset($this->rooms[$topic], $this->roomLookup[array_search($topic, $this->roomLookup)]);
        $this->broadcast(static::CTRL_ROOMS, array($topic, 0));
    } else {
        $this->broadcast($topic, array('leftRoom', $conn->WAMP->sessionId));
    }
}

这只是一个扩展教程的应用示例,因此其他人也可以使用它。

如果您需要任何进一步的帮助,请告诉我