![]() |
|
||||||||||
|
|||||
|
Посоветуйте как решить задачу.
Приложение для соцсетей, соответственно приложение всегда знает онлайн юзер или нет (кстати, как часто обновляется эта информация? То есть если юзер закроет страницу с приложением, то как быстро я получу ответ, что юзер ушел в офлайн?). Есть две группы юзеров. Одна (многочисленная) должна всегда знать онлайн юзер из второй группы (20-30 членов) или нет. Записываю всех членов из второй группы в БД. Когда члены второй группы заходят в приложение, то в БД ставлю флаг - онлайн. Когда юзеры из первой группы заходят в приложение, то они получают инфу по всем кто сейчас онлайн из второй группы - это просто делается запрос к БД. До этого момента все хорошо. Но теперь член из второй группы решил закрыть приложение никого не уведомив. Вопрос: как лучше проверять наличие онлайн членов второй группы? Первое что приходит на ум, это кроме того, чтобы записывать в БД опцию членов второй группы, постоянно проверять при открытии приложения остальными юзерами наличие членов второй группы и тоже писать их статус в базу. Но тогда юзер, который открыл 5 минут назад приложение никогда не узнает, что член из второй группы покинул приложение 3 минуты назад и будет проблема. Можно ещё делать проверки по таймеру, но непонятно в какой позиции? И не положат ли сервак многочисленные проверки? |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Пусть эти 30 чел. раз в минуту (или сколько нравится) апдейтят свой статус (просто писать время).
Если время последнего апдейта больше 1.5 минуты - он оффлайн. Или эти 30 коннектятся сокетом - при коннекте писать флаг, что он есть, при дисконнекте его сбрасывать.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Как то тоже делал подобную штуку. Насколько я понял, нет достоверного способа определить когда пользователь закрыл браузер, и даже, когда перешёл на другую вкладку поддерживается только, кажется, ФФ, в JS есть методы окончания сессии, но они не успевают срабатывать до закрытия браузера. Основная политика такая: сервер некоторое время (кажется 10мин.) держит сессию пользователя активной, если за это время страница ни разу не послала запрос сервер закрывает сессию, и если нет параллельного наблюдения в куках, то в следующий запрос с той же страницы уже считается новой сессией.
Решается, да, в основном пингом, через ajax, через произвольные промежутки. Где то видел скрипт на TCL, автор утверждал, что при одновременном нахождении в чате 150 чел. потребляемые ресурсы памяти будут в пределах, кажется 40Мб, за счёт того, что TCL может демона подвесить на сервере. Но TCL обычно не установлен, об этом надо просить админов. |
|
|||||
|
Регистрация: Mar 2008
Сообщений: 215
|
В случае с сокетом можно достоверно выяснить, подключен ли пользователь или нет. Для этого достаточно отправить ему какое-нибудь сообщение (т.н. пинг). Вывалится сообщение - пользователь оффлайн.
|
|
|||||
|
Нет, я не использую соекты, а stratus для чата.
Цитата:
Задача немного усложняется тем, что вообще-то у члена второй группы должно быть не два статуса, а три (онлайн, офлайн и занят). Третий статус возникает во время чата с одним из юзеров и член становится недоступен для остальных юзеров. Когда чатящийся юзер любым способом покидает чат, то статус члена опять возвращается в онлайн. И вот здесь тоже проблема - если юзер просто закрыл окно браузера, это никак не отражается у члена и не пойму как его перевести опять в онлайн. fish_r, спасибо, но TCL, ajax - это сложнова-то. |
![]() |
![]() |
Часовой пояс GMT +4, время: 00:18. |
|
|
« Предыдущая тема | Следующая тема » |
|
|