7

问候 stackoverflow 的人们,在过去的几天里,我一直在研究 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 获取对象的最佳方法是什么,一种方法是这样的:

//$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]

您可以拥有更复杂的数组(也许您想将它们全部放在一个嵌套数组中),但解决方案在于将该数组的第一级键设为 resourceId。

于 2013-11-01T22:24:37.377 回答