@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 курильщика" получается.
  • Вопрос задан
  • 497 просмотров
Решения вопроса 1
Я бы проблему решал на клиенте, нужно реализовать "общение" между вкладками и всегда проверять, чтобы соединение с сокет-сервером держала только одна вкладка.
Далее если человек переключает вкладки - тогда только активная вкладка соединяется с сокет-сервером, все остальные соединение обрывают. Если человек ушел на сторонный ресурс, значит соединение будет только у последней активной вкладки.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
от 50 000 до 80 000 руб.
OV Global Санкт-Петербург
До 150 000 руб.
SaveTime Москва
от 160 000 руб.