Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уведомление о новых сообщениях 
:(
    Опции темы
maxipub
Дата 26.6.2014, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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-запросу, чтоб там вообще не было никаких кук, кеша и прочего - отрубить на корне. Чтобы минимизировать нагрузку как на сервер, так и на клиента.

Ваше мнение?

smile  smile  smile
PM MAIL   Вверх
ksnk
Дата 26.6.2014, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



В принципе - нормально.
Для контроля одновременных окон с сервисом разумно использовать броузерные куки, "перед" минутным опросом сервера. В куку записывается "активным окном" текущее время. Если время в куке отличается больше чем на минуту - начинаем выборы. Понятно, что для одновременно открытых окон в разных броузерах или в "режиме инкогнито" куки разделятся не будут, так что полностью отказываться от опроса сервера - нельзя.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Aliance
Дата 26.6.2014, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Не смотря на строчки о том, чтобы не предлагать комет и аналоги, все же скажу: такие вещи логичнее всего делать через сокеты. И это не такая страшная технология. Там идет запрос в обратную сторону, так что никакой нагрузки не будет. Страница всего лишь слушает сокет, и только когда он реально приходит (а это происходит на бекэнде уже), воспроизводит звук. Так сделано вконтакте с сообщениями, например. Это еще и уберет задержку (не раз в 10 секунд, а моментально).

Определение же текущего активного окна не сильно сложная вещь. Можно погуглить, например, по слову idle в контексте js (кстати, подсмотреть реализацию можно в том же контакте, там это используется, скажем, чтобы при воспроизведении видео останавливать аудио во всех открытых вкладках).

А вот авторизация через get - точно не ахти идея. Авторизация должна быть только post.
PM MAIL WWW ICQ Skype   Вверх
maxipub
Дата 26.6.2014, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Большое спасибо за участие! smile

Цитата(ksnk @  26.6.2014,  13:09 Найти цитируемый пост)
броузерные куки

Кажется, что-то интересное. Но что это такое? Поиск без результатов...

Цитата(Aliance @  26.6.2014,  13:21 Найти цитируемый пост)
Определение же текущего активного окна не сильно сложная вещь.

Не совсем понял, что оно нам может дать?

Ведь все равно из какой вкладки выполнять проверки. Главное, чтобы она была одна. И чтобы проверки выполнялись, если хоть одна вкладка сайта открыта. И чтоб это для своей работы не требовало никаких действий со стороны пользователя.

А пользователь не только по нашему сайту ходит, активное окно может быть с другого сайта.

Цитата(Aliance @  26.6.2014,  13:21 Найти цитируемый пост)
А вот авторизация через get - точно не ахти идея. Авторизация должна быть только post. 

Почему?

Насколько знаю, общепринято, GET - получение данных (например, получить топик на форуме), POST - изменение (например, отправить пост на форуме). Ну POST еще использую когда много или объемные. Например, даже поиск обычно делают через GET (иначе пользователи будут делиться ссылками на пустые результаты smile). А тут запрос будет максимум вида http://sys-domain.com/get_new_msg_count/user_id/user_key/

ЗЫ: по Comet - имей я дело с чатом, например, может быть. Но с моей задачей (и для меня - в первую очередь smile) это как с пушки по воробьям.
PM MAIL   Вверх
ksnk
Дата 26.6.2014, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(maxipub @  26.6.2014,  14:16 Найти цитируемый пост)
Кажется, что-то интересное. Но что это такое? Поиск без результатов...

Это localStorage.
Я немного попутал, почему то мне казалось, что вместе с httpOnly появился и флаг  browserOnly. Оказалось - нет. smile
Для неподдерживающих такое броузеров - можно и куку использовать, хотя, вероятно, возится в этом случае уже не обязательно.

Это сообщение отредактировал(а) ksnk - 26.6.2014, 17:16


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
maxipub
Дата 26.6.2014, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Цитата(ksnk @  26.6.2014,  17:13 Найти цитируемый пост)
localStorage

О, круто! Потестирую, мне кажется, с его помощью запросы "раз в минуту" можно будет вообще убрать. smile

Цитата(ksnk @  26.6.2014,  17:13 Найти цитируемый пост)
Я немного попутал, почему то мне казалось, что вместе с httpOnly появился и флаг  browserOnly. Оказалось - нет.

Не совсем понял к чему это в контексте (?) localStorage ? smile 
PM MAIL   Вверх
Aliance
Дата 27.6.2014, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Цитата(maxipub @  26.6.2014,  15:16 Найти цитируемый пост)
Почему?

Насколько знаю, общепринято, GET - получение данных (например, получить топик на форуме), POST - изменение (например, отправить пост на форуме). Ну POST еще использую когда много или объемные. Например, даже поиск обычно делают через GET (иначе пользователи будут делиться ссылками на пустые результаты ). А тут запрос будет максимум вида http://sys-domain.com/get_new_msg_count/user_id/user_key/

Поиск и должен быть GET, это же получение данных ;)

А авторизацию прячут в POST, например, чтобы не было ссылки в истории браузера. 
user_key - это что, токен?
PM MAIL WWW ICQ Skype   Вверх
maxipub
Дата 27.6.2014, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Цитата(Aliance @  27.6.2014,  10:19 Найти цитируемый пост)
user_key - это что, токен? 

Да. Ну то будет не авторизация в полном смысле этого слова. В этой информации (факт наличия нового сообщения) нет ничего сколько-нибудь секретного. Лишь чтоб лишний раз не подпитывать любопытство, добавим простой токен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0795 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.