@Hellek
Люблю говорить и слышать суть

Какая логика работы в Socket.io с несколькими вкладками логичней?

Приветствую коллеги, перечитал уже 3 десятка страниц, но так и не нашел более-менее правильного на мой взгляд решения.

Входящие данные:
Веб-сервер NGINX
Вся логика написана на PHP
nodejs + socket.io использую для работы с веб-сокетами
Проект - самописная CRM система.

Задача выглядит таким образом:
1) За каждым менеджером закреплен конкретный заказ с указанным телефоном клиента. При поступлении звонка на АТС, я отлавливаю номер звонящего PHP'шкой, определяю что это за заказ и какому менеджеру он принадлежит.
2. Как должно быть) В socket.io летит JSON с этой инфой, он в свою очередь передает инфу в браузер, где у менеджера сразу же открывается новая вкладка с этим заказом.

2. Как сейчас (dev mode) - если у менеджера открыто 3 вкладки, то будет открыто 3 вкладки новых автоматически с этим заказом. Если открыто 15, а менеджеры иногда так делают при прозвоне, то откроется 15 дополнительно.

Как я могу это реализовать, но это какой-то костыльный вариант.
1) При первом входе в систему в socket-io загружается инфа о менеджере где ключом будет его PHPSESSID. Тогда при каждом открытии странице не придётся foreach'ить весь массив, а достаточно будет проверить есть ли уже в массиве users['текущий PHPSESSID'].
2) Но тут возникает иная проблема, Каждый раз когда нужно будет определить какому менеджеру отправить сообщение, нам придётся бегать по циклу и на втором уровне вложенности сверять manager_id пришедший от php с подключенными.
3) Как сделать так, чтобы на каждый запрос открывалась только 1 вкладка? При каждом установлении соединения клиента с socket.io писать в одно из "свойств" текущего менеджера на какую последнюю страницу он заходил, и сверять location.path+location.search с тем что в адресной строке браузера. Почему костыль? Потому, что строка запроса может быть символов 200, а то и под 800 и построчное сравнение совсем не в тему.

Может есть уже готовое решение для данной проблемы? Какой то "socket.io курильщика" получается.
  • Вопрос задан
  • 511 просмотров
Решения вопроса 1
Я бы проблему решал на клиенте, нужно реализовать "общение" между вкладками и всегда проверять, чтобы соединение с сокет-сервером держала только одна вкладка.
Далее если человек переключает вкладки - тогда только активная вкладка соединяется с сокет-сервером, все остальные соединение обрывают. Если человек ушел на сторонный ресурс, значит соединение будет только у последней активной вкладки.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы