棘轮/ Websockets:订阅对象的客户数量是多少?

Bri*_*euc 6 php websocket phpwebsocket ratchet

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

更确切地说,我只想知道是否有超过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_id\n";
    }
    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);
    }
}
Run Code Online (Sandbox Code Playgroud)

那么在给定的代码中,如何获得$ nb_clients?


更新:

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

这是我的第二次尝试:

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_id\n";
    }
    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();
    }
}
Run Code Online (Sandbox Code Playgroud)

任何想法,如果这将适当的工作?它实际上似乎工作,但我仍然不确定它是否是最好的解决方案.我实际上是从Ratchet github那里获得灵感的.

Vol*_*enD 5

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

onPublish(Ratchet\ConnectionInterface $ conn,string | Ratchet\Wamp\Topic $ topic,string $ event,array $ exclude,array $ eligible)

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

$nb_clients = $conversation_id->count();
Run Code Online (Sandbox Code Playgroud)