2015-06-18 35 views
6

Chciałbym wiedzieć, ilu klientów faktycznie subskrybuje czat/rozmowę.Ratchet/Websockets: Ile klientów subskrybuje obiekt?

Aby być bardziej precyzyjnym, chcę tylko wiedzieć, czy jest więcej niż 1 klienta. (Chatroom to w rzeczywistości prywatna rozmowa dwóch użytkowników).

Jest tylko jedna rozmowa na czacie/prywatna rozmowa na raz (na użytkownika).

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

Więc w podanym kodzie jak uzyskać $ nb_clients?


Aktualizacja:

Chyba zaczynam widzieć rozwiązanie.

Oto moja druga próba:

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

Wszelkie pomysły, jeżeli byłoby właściwie działa? Wydaje się, że działa, ale nadal nie jestem pewien, czy to najlepsze rozwiązanie. Zainspirował mnie jeszcze Ratchet github.

+0

Podany kod jest bardzo rzadki ... – Tschallacka

+0

Cóż, mogę dodać więcej, to nie jest mój cały kod, ale starałem się, aby to proste nie powodowało zamieszania. Wszystkie części logiczne do zapisania w bazie danych, które zostały usunięte z tego fragmentu. Ten kod działa. Nie jestem pewien, czy pomocny byłby kod końca. – Brieuc

+0

Kod ten nie nadaje się do użytku na twoje pytanie. Gdzie jest twoja pula wątków? gdzie klienci są rejestrowani i otrzymują swój własny obiekt? gdzie jest hashmap/arraylist/linkqueue, gdzie śledzisz? – Tschallacka

Odpowiedz

4

Drugi argument onPublish jest Topic obiekt (Interface WampServerInterface):

onPublish (Ratchet \ ConnectionInterface $ conn, ciąg | Ratchet \ Wamp \ Wątek $ temat, string $ wydarzenie, array $ wykluczyć, tablica $ kwalifikuje)

więc według Ratchet's documentation, można użyć metody count() na ten temat, aby uzyskać subskrybentów:

$nb_clients = $conversation_id->count();