Задать вопрос

Как правильно отправлять уведомления во множество вкладок посредством socket.io?

Друзья, добрый день.

Столкнулся с весьма интересной задачей (возможно только для меня). Реализую уведомления посредством socket.io, redis. Все это крутится на yii2.

Суть вопроса. При отправке уведомления пользователю, уведомления дублируются. Количество дублированных уведомлений зависит от количество открытых вкладок.

Клиентская часть. Здесь создаем комнату для пользователя и подписываемся на уведомления.

var socket = io();
socket.emit("join", {"room": userRoom});
socket.on("notify", function (data) {
     $( "#notifications" ).prepend(data.message);
});


Серверная часть.

io.on('connection', function (socket) {
        var redisClient = redis.createClient(6379, 'redis');
        redisClient.subscribe('notify');
        redisClient.on("message", function(channel, message) {
            var res = JSON.parse(message);
            io.sockets.in(res.room).emit(channel, {msg: res.message});
        });
        socket.on('disconnect', function() {
            redisClient.quit();
        });
    });


Как отправляется уведомление.
Yii::$app->redis->executeCommand('PUBLISH', [
    'channel' => 'notify',
    'message' => \yii\helpers\Json::encode(['room' => 'room', 'message' => 'hello'])
]);


Собственно работает хорошо. Но чем больше я открою влкадок браузера те больше я получу дублированных сообщений в одной вкладке. К примеру, у меня открыто 5 вкладок. Я инициирую один раз executeCommand и передаю сообщение hello. Таким образом в каждой из 5 вкладок появляется по 5 слов "Hello". При этом я смотрю через redis-cli monitor и вижу что только одно уведомление создается.

Заранее благодарен за подсказку.

Спасибо
  • Вопрос задан
  • 465 просмотров
Подписаться 8 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Onskills
    PHP: базовый курс
    1 месяц
    Далее
  • teamcoding
    TC200PY Разработка PHP веб-приложений на Yii2. Шаблон приложения advanced
    3 месяца
    Далее
  • FructCode
    Yii2 Фреймворк
    2 месяца
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы