Ratchet / Websockets: How many clients subscribe to an object?

I would like to know how many clients actually subscribe to the chat / conversation.

To be more precise, I just want to know if there is more than one client. (Chat chat is actually a private conversation between two users).

There is only one chat / private conversation at a time (per user).

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); } } 

So, in this code, how to get $ nb_clients?


Update:

I think I'm starting to see a solution.

Here is my second attempt:

 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(); } } 

Any ideas if this would work correctly? It actually works, but I'm still not sure if this is the best solution. I really got inspiration from Ratchet github .

+6
source share
1 answer

The second argument to onPublish is the Topic object ( WampServerInterface Interface ):

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

therefore, according to the Ratchet documentation , you can use the count() method on this topic to get subscribers:

 $nb_clients = $conversation_id->count(); 
+4
source

Source: https://habr.com/ru/post/989352/


All Articles