2016-05-29 9 views
1

ラチェットを使用してグループチャットのプッシュ通知を有効にしています。私は次の操作を実行することを決定したラチェット、接続時にクライアントのトピックを閉じる

  • ユーザーが接続するたび、その個人的なメッセージの話題と一緒の彼は一部、すべてのグループのトピックに彼をサブスクライブします。

私はラチェットのチュートリアルで述べたように、トピックのprotected $subscribedTopics = array();を持っています。

これは機能しますが、時間が経つとグループトピック/ユーザートピックの数が増えます(登録トピックアレイからこれらのトピックを削除する方法はありません)。

私のアプリは、クライアントからサーバーにメッセージを送信することを許可しておらず、また、ユーザーの購読を拒否することもできません。それだけで接続を閉じることができます

私は、ユーザーが購読しているすべてのトピックを閉じるには、閉じるときに必要です(私のロジックは、彼が一部のトピックの唯一のサブスクライバである場合、加入のトピック)の配列は

OnCloseの方法は次のとおりです。

public function onClose(ConnectionInterface $conn) { 
    echo "close"; 
} 

私はそれをどのように行うことができますか?

答えて

1

接続解除後もトピックからの登録解除を呼び出す必要があります。これは、websocketから完全に削除するためです。このコードを使用して

public function onClose(ConnectionInterface $conn) { 
    foreach ($conn->Chat->rooms as $topic => $one) { 
     $this->onUnSubscribe($conn, $topic); 
    } 
} 

あなたは、接続が閉じられたときに$ topicから退会することができます。

、あなたは同様に、この何かが必要になります作業退会をする:

function onUnSubscribe(ConnectionInterface $conn, $topic) { 
    unset($conn->rooms['topic']); 
    $this->rooms[$topic]->detach($conn); 
    if ($this->rooms[$topic]->count() == 0) { 
     unset($this->rooms[$topic], $this->roomLookup[array_search($topic, $this->roomLookup)]); 
     $this->broadcast(static::CTRL_ROOMS, array($topic, 0)); 
    } else { 
     $this->broadcast($topic, array('leftRoom', $conn->WAMP->sessionId)); 
    } 
} 

これは、それが同様に他の人が使用することができるように、チュートリアルを拡張するだけで適用されたサンプルです。

さらなる助けが必要な場合はお知らせください

+0

私はあなたをラチェットのPHPライブラリに追加しました。あなたはそこで話していただけますか? ありがとうございます –

+0

http://chat.stackoverflow.com/rooms/info/113247/ratchet-php-library –

+0

$ conn-> Chatですか、isControl()ですか? –

関連する問題