7

ここ数日、私は websockets と、Ratchet と呼ばれる PHP ライブラリ (PHP で websockets サーバー アプリケーションを作成するのに理想的です) について調べてきました。Ratchet の公式ドキュメントでは、クライアント接続オブジェクトの管理に SplObjectStorage (私は聞いたことがありません) を使用することを推奨しています。

ほとんどのサーバーアプリケーションでは、おそらく各クライアントに関するデータを保持する必要があります(たとえば、単純なメッセージングサーバーの作成を実験している私の場合、クライアントのニックネームなどのデータを保持する必要があります)ので、私が理解しているように以下のように、新しい接続が開かれたときに、クライアント オブジェクトとクライアント データを含む配列を SplObjectStorage に追加できます。

public function onOpen(ConnectionInterface $conn) {
    //$this->clients is the SplObjectStorage object
    $this->clients[$conn] = array('id' => $conn->resourceId, 'nickname' => '');

}

ただし、データ配列の値 (ユーザーのニックネームなど) によって SplObjectStorage からオブジェクトを取得する最良の方法が何であるかはわかりません。1 つの方法は次のようになります。

//$this->clients is my SplObjectStorage object where I keep all incoming connections
foreach($this->clients as $client){ 
    $data = $this->clients->offsetGet($client);

    if($data['nickname'] == $NickNameIAmLookingFor){
        //Return the $client object or do something nice
    }
}

しかし、これを行うためのより良い方法があると思うので、アドバイスをいただければ幸いです。

前もって感謝します。

4

1 に答える 1

-2

SplObjectStorage を使用する必要はありません。をclientsキーにした配列resourceIdを作成し、 についても同じことを行いnicknamesます。

// in __construct()
$this->clients = [];
$this->nicknames = [];

// in onOpen
$this->clients[$conn->resourceId] = $conn;
$this->nicknames[$conn->resourceId] = '';

その後、次のようにアクセスできます

$this->clients[$conn->resourceId]
$this->nicknamees[$conn->resourceId]

より複雑な配列を使用することもできます (おそらく、それらすべてを 1 つのネストされた配列に入れたいと思うでしょう) が、解決策は、その配列の第 1 レベルのキーを resourceId にすることです。

于 2013-11-01T22:24:37.377 に答える