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.
Podany kod jest bardzo rzadki ... – Tschallacka
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
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