【问题标题】:Ratchet , get client's topics on connection closeRatchet ,在连接关闭时获取客户的主题
【发布时间】:2016-05-29 01:06:22
【问题描述】:

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

我决定做以下事情:

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

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

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

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

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

onClose 方法是:

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

我该怎么做?

【问题讨论】:

    标签: php websocket ratchet


    【解决方案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));
        }
    }
    

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

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

    【讨论】:

    • 我已将您添加到房间 Ratchet php 库中。你能在那里谈谈吗?提前致谢
    • 什么是 $conn->Chat ?和 isControl() ?
    • 只是从连接中删除话题,聊天对象是我自己的,可以否定
    • 我更改了代码,这应该更清楚,一旦你得到它的作用,我建议你为自己的应用程序重新考虑它
    • 如果我调用 onUnsubscribe ,如何区分来自客户端的请求或函数 onClose()?我不希望他能够退订
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2013-08-10
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    相关资源
    最近更新 更多