Поиск данных в 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.

Другие вопросы по тегам