Ratchet ,获取客户关于连接关闭的主题
Ratchet , get client's topics on connection close
我正在使用 ratchet 为群聊启用推送通知。
我决定执行以下操作:
- 每当用户连接时,为他订阅他参与的所有组主题以及个人消息主题。
我有一系列 protected $subscribedTopics = array();
棘轮教程中提到的主题。
这可行,但随着时间的推移,组 topics/user 主题的数量只会增加(无法从订阅的主题数组中删除这些主题)。
根据设计,我的应用程序不允许从客户端向服务器发送消息,也不允许用户取消订阅。它只能关闭连接
所以,我需要一种方法来获取用户已订阅的所有主题,当他关闭时(我的逻辑是,如果他是某些主题的唯一订阅者,则从订阅的主题数组中删除这些主题)
onClose 方法是:
public function onClose(ConnectionInterface $conn) {
echo "close";
}
我该怎么做?
您仍然需要在连接关闭后调用取消订阅主题以将其从 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 为群聊启用推送通知。
我决定执行以下操作:
- 每当用户连接时,为他订阅他参与的所有组主题以及个人消息主题。
我有一系列 protected $subscribedTopics = array();
棘轮教程中提到的主题。
这可行,但随着时间的推移,组 topics/user 主题的数量只会增加(无法从订阅的主题数组中删除这些主题)。
根据设计,我的应用程序不允许从客户端向服务器发送消息,也不允许用户取消订阅。它只能关闭连接
所以,我需要一种方法来获取用户已订阅的所有主题,当他关闭时(我的逻辑是,如果他是某些主题的唯一订阅者,则从订阅的主题数组中删除这些主题)
onClose 方法是:
public function onClose(ConnectionInterface $conn) {
echo "close";
}
我该怎么做?
您仍然需要在连接关闭后调用取消订阅主题以将其从 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));
}
}
这只是一个扩展教程的应用示例,以便其他人也可以使用它。
如果您需要任何进一步的帮助,请告诉我