В последнее время партнеры из разных компаний начали спрашивать, как же запустить Push & Pull для гостей.
Для чего это нужно, для того что бы гостю выдавался один и тот же адрес канала и вы могли отправлять ему персонализированные команды.
С нашей стороны пришлось немного доработать модуль для такого режима, и для того что бы это разработало у вас, вам необходимо обновление модуля Push & Pull 15.5.1.
Что потребуется с вашей стороны?
Вам необходимо реализовать методы определение гостя, присвоение ему внутреннего числового идентификатора, допустим этот идентификатор у вас определился как 1.
Для того что бы не путать авторизованных и не авторизованных пользователей, передавать в модуль Push & Pull его нужно со знаком минус.
$guestId = -1; CModule::IncludeModule('pull'); CPullStack::AddByUser($guestId, Array( 'module_id' => 'test', 'command' => 'check', 'params' => Array(), )); |
Метод который определяет идентификатор, нужно реализовать и выполнить в прологе, до момента инициализации Push & Pull, для этого вам необходимо будет зарегистрировать зависимость:
RegisterModuleDependences("main", "OnProlog", "main", "", "", 2, "local/scripts/pull_hit.php"); |
$guestId = -1; // эту цифру должна вернуть ваша функция, определения идентификатора для гостя define('PULL_USER_ID', $guestId); |
Как работать с модулем подробно описывал в статье
Для удобства отладки, вы можете воспользоваться следующими JS командами:
BX.PULL.capturePullEvent(); |
BX.PULL.getDebugInfo(); |
Оптимизация кол-ва запросов к серверу
В последних версиях P&P появилась настройка путей, позволяющая для современных браузеров ходить напрямую на сервер очередей (отдельный адрес.
Это было реализовано для крупных проектов, у которых такой сервис находится на отдельном сервере.
До появления этой опции, если у вас сервер сайта и сервер очередей находились на разных серверах, то вам приходилось делать проксирование запросов (запрос приходилось отправлять на сервер сайта, так как старые браузеры не поддерживают прямые запросы AJAX на другие домены и уже от туда перенаправлять на сервер очередей через внутренние правила), это создавало нагрузку и лишний трафик.
Слава богу число пользователей с современными браузерами с каждым днем все больше и больше, (более 80% по разным оценкам), а это значит для 80% вашего трафика на сервер очередей можно экономить!
Теперь все новые браузеры стучатся напрямую на сервера, но из-за особенности работы нашей реализации JS с сервером, им приходится делать дополнительно на каждое подключение OPTIONS запрос.
Для того что бы избавится от него, вам необходимо проверить конфигурационные файлы сервера.
Откройте файл bx/conf/im_subscrider.conf, в описании локейшена location ^~ /bitrix/sub { проверьте есть ли у вас такое условие, если нет - добавьте:
if ($arg_time) { push_stream_last_received_message_time "$arg_time"; } |
push_stream_subscriber long-polling; push_stream_allowed_origins "*"; push_stream_channels_path $arg_CHANNEL_ID; push_stream_last_received_message_tag $arg_tag; if ($arg_time) { push_stream_last_received_message_time "$arg_time"; } |
COption::SetOptionString("pull", "nginx_headers", "N"); |
Остались вопросы? Пишите!
if ($arg_time) { push_stream_last_received_message_time "$arg_time"; }
Это мы пытаемся оптимизировать количество запросов к серверу nginx, когда модуль работает в режиме nginx, и nginx находится на другом сервере?
Получается, на нагрузку сайта это особо не влияет. Nginx в большинстве случаев с нагрузкой отлично справляется. Актуально только для больших проектов, когда очередь nginx ставят на отдельный сервер. Но большие проекты как раз очень заинтересованы в пользователях со старыми браузерами.
Работает на основе модуля "Веб-аналитика", если вы использовали метод из этой статьи, он продолжит свою работу.
Теперь не нужно вручную формировать $guestId?