棘轮/Websockets:订阅一个对象的客户端数量



我想知道有多少客户实际上订阅了聊天室/对话。

更准确地说,我只想知道是否有超过 1 个客户端。(聊天室实际上是两个用户之间的私人对话)。

一次只有一个聊天室/私人对话(每个用户)。

class Chat implements WampServerInterface
{
    protected $conversationId;
    public function __construct(){
        $this->conversationId = null;
    }
    public function onSubscribe(ConnectionInterface $conn, $conversation_id){
        $this->conversationId = $conversation_id;
        echo "Client $conn->resourceId assigned to the conversation : $conversation_idn";
    }
    public function onPublish(ConnectionInterface $conn, $conversation_id, $event, array $exclude, array $eligible){
        // How to get $nb_clients ?
        echo "$nb_clients User(s) in conversation";
        echo "Message sent to $conversation_id : $event";
        // ...
        $message = $event; 
        // Send data to conversation
        $this->conversationId->broadcast($message);
    }
}

那么在给定的代码中,如何获取$nb_client?


更新:

我想我开始看到一个解决方案。

这是我的第二次尝试:

class Chat implements WampServerInterface
{
    protected $conversation  = array();
    public function onSubscribe(ConnectionInterface $conn, $conversation_id){
        $conversation_id = (string) $conversation_id;
        if(!array_key_exists($conversation_id, $this->conversation)){
            $this->conversation[$conversation_id] = 1;
        }
        else{
            $this->conversation[$conversation_id]++;
        }
        echo "{$this->conversation[$conversation_id]}n";
        echo "Client $conn->resourceId assigned to the conversation : {$conversation_id}n";
    }
    public function onUnSubscribe(ConnectionInterface $conn, $conversation_id){
        // Foreach conversations or given conversation remove one client
        $this->conversation[$conversation_id]--;
        echo "$this->conversation[$conversation_id]n";
        echo "Client $conn->resourceId left the conversation : $conversation_idn";
    }
    public function onOpen(ConnectionInterface $conn){
        echo "New connection! ({$conn->resourceId})n";
    }
    public function onClose(ConnectionInterface $conn){
        $this->onUnsubscribe($conn, $this->conversation);
        echo "Connection closed!n";
    }
    public function onCall(ConnectionInterface $conn, $id, $fn, array $params){
    }
    public function onPublish(ConnectionInterface $conn, $conversation_id, $event, array $exclude, array $eligible){
        $conversation_id = (string) $conversation_id;
        $nb_clients = $this->conversation[$conversation_id]
        echo "$nb_clients User(s) in conversation";
        echo "Message sent to $conversation_id : $event";
        // ...
        $message = $event; 
        // Send data to conversation
        $this->conversation[$conversation_id]->broadcast($message);
    }
    public function onError(ConnectionInterface $conn, Exception $e){
        echo "An error has occurred: {$e->getMessage()}n";
        $conn->close();
    }
}

任何想法是否可以正常工作?它实际上似乎有效,但我仍然不确定它是否是最佳解决方案。实际上,我的灵感来自Ratchet github。

onPublish的第二个参数是一个Topic对象(Interface WampServerInterface):

onPublish( Ratchet\ConnectionInterface $conn, 字符串|棘轮\Wamp\主题 $topic, 字符串$event, 数组 $exclude, 数组 $eligible )

所以根据 Ratchet 的文档,你可以使用count()方法来获取订阅者:

$nb_clients = $conversation_id->count();

相关内容

  • 没有找到相关文章

最新更新