поиск данных в splobjectstorage

Приветствую вас, люди из stackoverflow, в последние дни я смотрю на веб-сокеты и 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
    }
}

Но я чувствую, что есть лучший способ сделать это, поэтому любые советы будут очень признательны.

Заранее спасибо.


person Binni    schedule 01.11.2013    source источник
comment
У меня также есть этот вопрос. И не интересуются ответами типа не надо так делать и т.д.   -  person CommaToast    schedule 21.11.2014


Ответы (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]

У вас могут быть более сложные массивы (возможно, вы захотите поместить их все в один вложенный массив), но решение заключается в том, чтобы сделать ключ первого уровня этого массива идентификатором ресурса.

person mattexx    schedule 01.11.2013