![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
Добрый день!
Постараюсь описать задачу лаконично, но проникновенно. Необходимо сделать уведомления о новых сообщениях на сайте (не развлекательный, связанный с работой). На данный момент, при поступлении новых сообщений, когда человек открывает страничку сайта, видит иконку письма. В этом плане все там наглядно сделано, и свою функцию выполняет. Проблема в том, что сообщение может прийти когда человек не на сайте (отошел, или просто смотрит другие сайты). Есть необходимость как-то уведомлять его о таких сообщениях максимально оперативно (ну, скажем, 10-15, даже 30 сек. задержка тут приемлема, режима реального времени не требуется). 1. Сперва думал об информировании по СМС. Но сообщений может быть по несколько десятков в день, и большую часть из них человек все равно сразу замечает сам в приемлемый отрезок времени. Таким образом, банально постоянно смотреть и удалять сообщения будет неудобно. Конечно, можно сделать задержку минуты в две, и только если спустя это время человек не откроет сообщение, слать СМС. Это позволит уменьшить количество последних примерно на 2/3, но все равно, не ахти как удобно использовать СМС в этих целях. 2. Пришел к мысли, что это должен быть какой-либо звуковой сигнал. Как в аське, например. Тут возникает проблемка... Можно сделать отдельную страницу, которую открываешь, она у тебя висит, "раз в 10 секунд" опрашивает сервер, и если что, "ой-ой кает" при поступлении нового сообщения. Но очевидно, что открывать и держать отдельную вкладку не намного удобней. К тому же это можно забыть сделать, или случайно закрыть ее. Нужно что-то более универсальное. 2.1. Встроить в странички некий модуль, который будет "раз в 10 секунд" опрашивать сервер, и если что... Уже лучше. Но вкладок со страничками сайта может быть (и оно почти всегда так и есть) много. "Ой-ой кнет" только одна из них - которая первой зафиксирует новое сообщение. Но, скажем, 1000 юзеров онлайн, у каждого по 10 вкладок, каждая "раз в 10 секунд" опрашивает сервер - не очень хороший подход для реализации такой мелочи. Нужно чтоб со всех открытых вкладок лишь один модуль работал. Но как это сделать? Можно активировать его при загрузке, но ведь вкладка с ним может быть легко закрыта..? 2.1.1. Вот к чему я пришел сейчас. На каждой страничке есть некий модуль, изначально работающий как запасной (частично активный). Он с некой, более редкой частотой, например, "раз в минуту", опрашивает сервер на предмет наличия работающего модуля для данного пользователя. Если такого модуля нет (или от него давно нет ответа, например, закрыли вкладку с ним), текущий модуль устанавливается в качестве активного, и он уже начинает опрашивать сервер "раз в 10 секунд" на предмет наличия новых сообщений. Модули на всех других вкладках в это время работают как запасные, и "раз в минуту" пытаются взять управление на себя (если рабочий более не активен). Где-то так. Что скажите? Может быть, будут варианты получше? Сразу скажу, я любитель решения задач минимальным и самым простым набором технологий. Просьба не предлагать использовать Comet или что-либо еще экзотическое для решения такой ерунды. Какие могут быть советы по оптимизации такой штуки? Я вот думаю, что опрашивать стоит не текущий домен (где идет авторизация по кукам), а выделить под это дело отдельный, с идентификацией пользователя по GET-запросу, чтоб там вообще не было никаких кук, кеша и прочего - отрубить на корне. Чтобы минимизировать нагрузку как на сервер, так и на клиента. Ваше мнение? ![]() ![]() ![]() |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
В принципе - нормально.
Для контроля одновременных окон с сервисом разумно использовать броузерные куки, "перед" минутным опросом сервера. В куку записывается "активным окном" текущее время. Если время в куке отличается больше чем на минуту - начинаем выборы. Понятно, что для одновременно открытых окон в разных броузерах или в "режиме инкогнито" куки разделятся не будут, так что полностью отказываться от опроса сервера - нельзя. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Не смотря на строчки о том, чтобы не предлагать комет и аналоги, все же скажу: такие вещи логичнее всего делать через сокеты. И это не такая страшная технология. Там идет запрос в обратную сторону, так что никакой нагрузки не будет. Страница всего лишь слушает сокет, и только когда он реально приходит (а это происходит на бекэнде уже), воспроизводит звук. Так сделано вконтакте с сообщениями, например. Это еще и уберет задержку (не раз в 10 секунд, а моментально).
Определение же текущего активного окна не сильно сложная вещь. Можно погуглить, например, по слову idle в контексте js (кстати, подсмотреть реализацию можно в том же контакте, там это используется, скажем, чтобы при воспроизведении видео останавливать аудио во всех открытых вкладках). А вот авторизация через get - точно не ахти идея. Авторизация должна быть только post. |
|||
|
||||
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
Большое спасибо за участие!
![]() Кажется, что-то интересное. Но что это такое? Поиск без результатов... Не совсем понял, что оно нам может дать? Ведь все равно из какой вкладки выполнять проверки. Главное, чтобы она была одна. И чтобы проверки выполнялись, если хоть одна вкладка сайта открыта. И чтоб это для своей работы не требовало никаких действий со стороны пользователя. А пользователь не только по нашему сайту ходит, активное окно может быть с другого сайта.
Почему? Насколько знаю, общепринято, GET - получение данных (например, получить топик на форуме), POST - изменение (например, отправить пост на форуме). Ну POST еще использую когда много или объемные. Например, даже поиск обычно делают через GET (иначе пользователи будут делиться ссылками на пустые результаты ![]() ЗЫ: по Comet - имей я дело с чатом, например, может быть. Но с моей задачей (и для меня - в первую очередь ![]() |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Это localStorage. Я немного попутал, почему то мне казалось, что вместе с httpOnly появился и флаг browserOnly. Оказалось - нет. ![]() Для неподдерживающих такое броузеров - можно и куку использовать, хотя, вероятно, возится в этом случае уже не обязательно. Это сообщение отредактировал(а) ksnk - 26.6.2014, 17:16 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
||||
|
||||
Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Поиск и должен быть GET, это же получение данных ;) А авторизацию прячут в POST, например, чтобы не было ссылки в истории браузера. user_key - это что, токен? |
|||
|
||||
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |