gpt4 book ai didi

php - 在 splobjectstorage 中查找数据

转载 作者:可可西里 更新时间:2023-10-31 23:51:14 25 4
gpt4 key购买 nike

问候 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
}
}

但我觉得有更好的方法可以做到这一点,因此我们将不胜感激任何建议。

提前致谢。

最佳答案

无需使用 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。

关于php - 在 splobjectstorage 中查找数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19731811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com