Я работаю над системой чата в реальном времени, в которой один пользователь может отправлять / получать сообщения определенному пользователю. Я использую Laravel и в контроллере Я сопоставляю объект соединения с resourceId.
$ This-> соединения [$ conn-> RESOURCEID] = $ сопп;
Чтобы найти resource_Id конкретного пользователя, я сохраняю resource_Id этого пользователя в базе данных против его уникального идентификатора. Таким образом, я могу найти resource_Id пользователя с его unique_id, а затем я могу найти объект интерфейса подключения, верно.
Когда user_1 отправляет сообщение user_2, user_2 успешно получает это сообщение.
В чем моя проблема ???
Предположим, что user2 открывает вкладку, скажем tab1, и соединение создано, он успешно получает сообщение от user_1. Пользователь_2 открывает другую вкладку, после чего создается новое соединение, и теперь, если он получит сообщение, оно появится только на вкладке_2 но я хочу, чтобы он появился на обеих вкладках.
Я знаю, почему он появляется на tab_2, когда при создании второго соединения он перезаписывает уже существующий resource_id в базе данных, поскольку я сохраняю только один resource_id для каждого пользователя.
Есть ли способ, что обе вкладки обрабатываются одним и тем же объектом подключения.
У меня есть решение. Я думаю, что я должен хранить несколько идентификаторов ресурсов против user_id в базе данных, чтобы я мог получить доступ ко всем соединениям конкретного пользователя и затем отправить сообщение всем соединениям. Это правильный подход, чтобы сделать это в моем случае?
вот код функции onOpen контроллера
function onOpen(ConnectionInterface $conn){
$this->connections[$conn->resourceId]=$conn;
$data=['action'=>'map_resource_id','resourceid'=>($conn->resourceId)];
//send the resource id to client to map this id against user_id
//the client send an ajax request to store the resource id against
//user_id
$conn->send(json_encode($data));
echo "New connection! ({$conn->resourceId})\n";
}
Код для метода onClose находится здесь
function onClose(ConnectionInterface $conn){
unset($this->connections[$conn->resourceId]);
$status=DB::update('update sockets set resource_id=0 where resource_id='.$conn->resourceId);
echo "Connection {$conn->resourceId} has disconnected\n";
}
Задача ещё не решена.
Других решений пока нет …