como obter o object de conexão de um usuário específico?

Estou trabalhando em um aplicativo Symfony em tempo real usando a biblioteca Ratchet , neste aplicativo eu preciso enviar alguns dados para um usuário específico para que a solução lógica fosse usar o SessionProvider que irá append um object de session Symfony2 a cada object de conexão recebida. Como a documentação indica que eu configurei um manipulador de session não-nativo para armazenar minhas sessões, ou seja, em um database via PDO. e isso funciona bem no momento, mas eu preciso obter o object Conexão de um usuário específico para lhe enviar alguns dados, então, de outra forma, preciso encontrar o object de conexão que faz referência a esse usuário e não consigo encontrar uma maneira de fazer isto ? o código do meu servidor:

$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(); 

Eu tive a mesma pergunta exatamente (menos Symfony) e aqui é o que eu fiz.

Com base no tutorial do mundo do Olá , substituí SplObjectStorage por uma matriz. Antes de apresentar minhas modificações, gostaria de comentar que, se você seguisse esse tutorial e entendesse, a única coisa que o impediu de chegar a esta solução você provavelmente não está sabendo o que o 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(); } } 

Claro, para torná-lo realmente útil, você também pode querer adicionar uma conexão DB e armazenar / recuperar esses resources.

Isto é o que eu fiz, tem algumas melhorias na mesma idéia.

adiciona 2 funções que você pode chamar em outro lugar: send_to () e 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(); } }