问候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
}
}
但我觉得有更好的方法可以做到这一点,所以任何建议都会受到高度赞赏。
提前致谢。
答案 0 :(得分:-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。