Поиск данных в splobjectstorage
Приветствую людей stackru, в последние дни я смотрел на веб-сокеты и библиотеку PHP под названием Ratchet (которая идеально подходит для написания серверных приложений веб-сокетов на PHP). В официальных документах 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
}
}
Но я чувствую, что есть лучший способ сделать это, поэтому любые советы будут с благодарностью.
Заранее спасибо.
1 ответ
Нет необходимости использовать 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.