Ratchet / Websockets: сколько клиентов подписываются на объект?

Я хотел бы знать, сколько клиентов на самом деле подписываются на чат / беседу.

Чтобы быть более точным, я просто хочу знать, есть ли больше одного клиента. (Чат на самом деле представляет собой частный разговор между двумя пользователями).

Единовременно может быть только одна чат-комната / приватная беседа (для каждого пользователя).

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

Итак, в данном коде, как получить $ 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();
    }
}

Есть идеи, правильно ли это сработает? Кажется, это действительно работает, но я все еще не уверен, что это лучшее решение. На самом деле я вдохновился Рэтчетом github.


person Brieuc    schedule 18.06.2015    source источник
comment
Данный код очень разрежен ...   -  person Tschallacka    schedule 24.06.2015
comment
Что ж, я могу добавить больше, это не весь мой код, но я постарался сделать его простым, чтобы не вносить путаницу. Вся логическая часть для сохранения в базе данных была удалена из этого фрагмента. Этот код действительно работает. Я не уверен, что код внешнего интерфейса поможет.   -  person Brieuc    schedule 24.06.2015
comment
Ну, этот код непригоден для вашего вопроса. Где ваш пул потоков? где клиенты регистрируются и получают собственный объект? где находится hashmap / arraylist / connectedqueue, где вы отслеживаете?   -  person Tschallacka    schedule 24.06.2015
comment
Ой, погоди. Я путала это с Java. Извините. На моем месте вы бы не использовали php для веб-сокетов. Я бы выбрал более оптимизированный язык для веб-сокетов, чем php.   -  person Tschallacka    schedule 24.06.2015
comment
К сожалению, я не хочу этого делать. Я бы хотел продолжить с этим. Я почти уверен, что есть способ сделать это.   -  person Brieuc    schedule 24.06.2015
comment
есть способ ... но вы выбираете идти по грунтовой дороге и отказываетесь от роскоши шоссе   -  person Tschallacka    schedule 24.06.2015
comment
У каждого языка программирования есть свои плюсы и минусы. Тогда я выберу грунтовую дорожку;).   -  person Brieuc    schedule 25.06.2015
comment
Вы пробовали использовать $conversation_id->count() (перед преобразованием в строку) - как описано в источнике github.com/ratchetphp/Ratchet/blob/master/src/Ratchet/Wamp/   -  person VolenD    schedule 26.06.2015
comment
Что ж, похоже, это работает. Я думал, что это вернет общее количество клиентов, несмотря на назначенный им разговор. Я должен попробовать это в реальной ситуации, но у меня еще нет подходящего сервера. Предлагаю представить это как ответ;).   -  person Brieuc    schedule 26.06.2015


Ответы (1)


Второй аргумент onPublish - это объект Topic (Interface WampServerInterface):

onPublish (Ratchet \ ConnectionInterface $ conn, строка | Ratchet \ Wamp \ Topic $ topic, строка $ event, массив $ exclude, массив $ допустим)

поэтому, согласно документации Ratchet, вы можете использовать count() метод получения подписчиков по теме:

$nb_clients = $conversation_id->count();
person VolenD    schedule 26.06.2015