как получить объект соединения конкретного пользователя?

Я работаю в приложении Symfony в реальном времени, используя библиотеку Ratchet , в этом приложении мне нужно отправить некоторые данные конкретному пользователю, поэтому логическое решение заключалось в использовании SessionProvider, который будет прикреплять объект Session Symfony2 к каждому входящему объекту Connection. Как указано в документации, я установил не-собственный обработчик сеанса для хранения моих сеансов, то есть в базе данных через PDO. и это отлично работает на данный момент, но мне нужно, чтобы объект Connection конкретного пользователя отправил ему некоторые данные, поэтому другим способом мне нужно найти объект соединения, который ссылается на этого пользователя, и я не могу найти способ сделать это Это ? ее код сервера:

$app=new AggregateApplication(); $loop = \React\EventLoop\Factory::create(); $context = new \React\ZMQ\Context($loop); $pull = $context->getSocket(\ZMQ::SOCKET_PULL); $pull->bind('tcp://127.0.0.1:5555'); $pull->on('message', array($app, 'onNotification')); $webSock = new \React\Socket\Server($loop); $webSock->listen(8080, '127.0.0.1'); $handler = $this->getContainer()->get('session.handler'); $server=new \Ratchet\Wamp\WampServer($app); $server = new SessionProvider($server, $handler); $webServer = new \Ratchet\Server\IoServer(new \Ratchet\WebSocket\WsServer($server),$webSock); $loop->run(); 

У меня был тот же самый вопрос (минус Симфония), и вот что я сделал.

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

 class Chat implements MessageComponentInterface { protected $clients; public function __construct() { $this->clients = array(); } public function onOpen(ConnectionInterface $conn) { // Store the new connection to send messages to later $this->clients[$conn->resourceId] = $conn; echo "New connection! ({$conn->resourceId})\n"; } public function onMessage(ConnectionInterface $from, $msg) { $numRecv = count($this->clients) - 1; echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n" , $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's'); foreach ($this->clients as $key => $client) { if ($from !== $client) { // The sender is not the receiver, send to each client connected $client->send($msg); } } // Send a message to a known resourceId (in this example the sender) $client = $this->clients[$from->resourceId]; $client->send("Message successfully sent to $numRecv users."); } public function onClose(ConnectionInterface $conn) { // The connection is closed, remove it, as we can no longer send it messages unset($this->clients[$conn->resourceId]); echo "Connection {$conn->resourceId} has disconnected\n"; } public function onError(ConnectionInterface $conn, \Exception $e) { echo "An error has occurred: {$e->getMessage()}\n"; $conn->close(); } } не class Chat implements MessageComponentInterface { protected $clients; public function __construct() { $this->clients = array(); } public function onOpen(ConnectionInterface $conn) { // Store the new connection to send messages to later $this->clients[$conn->resourceId] = $conn; echo "New connection! ({$conn->resourceId})\n"; } public function onMessage(ConnectionInterface $from, $msg) { $numRecv = count($this->clients) - 1; echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n" , $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's'); foreach ($this->clients as $key => $client) { if ($from !== $client) { // The sender is not the receiver, send to each client connected $client->send($msg); } } // Send a message to a known resourceId (in this example the sender) $client = $this->clients[$from->resourceId]; $client->send("Message successfully sent to $numRecv users."); } public function onClose(ConnectionInterface $conn) { // The connection is closed, remove it, as we can no longer send it messages unset($this->clients[$conn->resourceId]); echo "Connection {$conn->resourceId} has disconnected\n"; } public function onError(ConnectionInterface $conn, \Exception $e) { echo "An error has occurred: {$e->getMessage()}\n"; $conn->close(); } } 

Конечно, чтобы сделать его действительно полезным, вы также можете добавить в соединение с БД и сохранить / получить эти идентификаторы ресурсов.

это то, что я сделал, имеет некоторые улучшения в той же идее.

добавляет 2 функции, которые вы можете вызвать в другом месте: send_to () и multicast ().

 namespace mine; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; class ws implements MessageComponentInterface { protected $clients; protected $clientids; public function __construct() { $this->clients = new \SplObjectStorage; $this->clientids = array(); } public function multicast($msg) { foreach ($this->clients as $client) $client->send($msg); } public function send_to($to,$msg) { if (array_key_exists($to, $this->clientids)) $this->clientids[$to]->send($msg); } public function onOpen(ConnectionInterface $conn) { $socket_name = "{$conn->resourceId}@{$conn->WebSocket->request->getHeader('X-Forwarded-For')}"; $this->clients->attach($conn,$socket_name); $this->clientids[$socket_name] = $conn; } public function onMessage(ConnectionInterface $from, $msg) { $this->multicast($msg); } public function onClose(ConnectionInterface $conn) { unset($this->clientids[$this->clients[$conn]]); $this->clients->detach($conn); } public function onError(ConnectionInterface $conn, \Exception $e) { $conn->close(); } } не namespace mine; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; class ws implements MessageComponentInterface { protected $clients; protected $clientids; public function __construct() { $this->clients = new \SplObjectStorage; $this->clientids = array(); } public function multicast($msg) { foreach ($this->clients as $client) $client->send($msg); } public function send_to($to,$msg) { if (array_key_exists($to, $this->clientids)) $this->clientids[$to]->send($msg); } public function onOpen(ConnectionInterface $conn) { $socket_name = "{$conn->resourceId}@{$conn->WebSocket->request->getHeader('X-Forwarded-For')}"; $this->clients->attach($conn,$socket_name); $this->clientids[$socket_name] = $conn; } public function onMessage(ConnectionInterface $from, $msg) { $this->multicast($msg); } public function onClose(ConnectionInterface $conn) { unset($this->clientids[$this->clients[$conn]]); $this->clients->detach($conn); } public function onError(ConnectionInterface $conn, \Exception $e) { $conn->close(); } }