2015-06-18 16 views
6

Tôi muốn biết có bao nhiêu khách hàng thực sự đang đăng ký một phòng chat/hội thoại.Ratchet/Websockets: Có bao nhiêu khách hàng đăng ký một đối tượng?

Để chính xác hơn, tôi chỉ muốn biết liệu có hơn 1 khách hàng hay không. (Chatroom thực sự là một cuộc trò chuyện riêng giữa hai người dùng).

Chỉ có một phòng trò chuyện/cuộc trò chuyện riêng tại một thời điểm (mỗi người dùng).

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

Vì vậy, trong các mã nhất định, làm thế nào để nhận được $ nb_clients?


Cập nhật:

Tôi đoán tôi bắt đầu nhìn thấy một giải pháp.

Đây nỗ lực thứ hai của tôi:

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

Bất cứ ý tưởng nếu điều đó đúng sẽ làm việc? Nó thực sự có vẻ làm việc nhưng tôi vẫn không chắc chắn nếu nó là giải pháp tốt nhất. Tôi thực sự lấy cảm hứng từ Ratchet github.

+0

Mã đã cho rất thưa thớt ... – Tschallacka

+0

Tôi có thể thêm nhiều hơn, đây không phải là toàn bộ mã của tôi nhưng tôi đã cố gắng giữ nó đơn giản ở đây để không mang lại bất kỳ sự nhầm lẫn nào. Tất cả các phần logic để lưu trong cơ sở dữ liệu như được loại bỏ khỏi đoạn mã đó. Mã này thực sự hoạt động. Tôi không chắc chắn rằng mã kết thúc trước sẽ giúp ích gì. – Brieuc

+0

Mã này không sử dụng được cho câu hỏi của bạn. Hồ bơi chủ đề của bạn ở đâu? nơi khách hàng nhận được đăng ký và nhận được đối tượng của riêng họ instantiated? hashmap/arraylist/linkedqueue ở đâu bạn theo dõi? – Tschallacka

Trả lời

4

Đối số thứ hai của onPublish là một đối tượng Topic (Interface WampServerInterface):

onPublish (Ratchet \ ConnectionInterface $ conn, chuỗi | Ratchet \ wamp \ Topic $ chủ đề, chuỗi $ sự kiện, mảng $ loại trừ, mảng $ đủ điều kiện)

để theo Ratchet's documentation, bạn có thể sử dụng phương pháp count() về chủ đề này để có được những thuê bao:

0.123.
$nb_clients = $conversation_id->count(); 
Các vấn đề liên quan