Как сделать онлайн/офлайн

У меня есть система входа. С моими магазинами сеансов входа в систему и файлами cookie (если вы «помните меня»), а затем вы входите в систему. Когда вы находитесь внутри системы входа в систему на home.php (вы можете войти, только если сессия / файл cookie зарегистрированы), я хочу, чтобы поле статуса в таблице «пользователь» обновлялось до онлайн и офлайн, когда вы выходите.

Я знаю, как это сделать, чтобы обновить статус при входе в систему и выходе из нее, но вот в чем дело: как мне поступить, когда пользователь покидает сайт, не выходя из системы (нажав на фактическую кнопку выхода)? Я имею в виду, если статус установлен на «В сети» и вы покинете страницу, она останется «В сети», вы можете понять ... логику ... так что мне делать в этой ситуации? Я не хочу иметь маленькое уродливое всплывающее окно, которое выводит вас из системы, когда вы покидаете страницу, это так старомодно и плохо.

Или, может быть, когда сеанс заканчивается, вы устанавливаете статус в автономном режиме? но опять же, как мне это сделать?

Идеи и примеры решения для этого были бы хороши.

На таких сайтах, как, например, facebook, в чате вы меняете статус на Idle, если покидаете страницы, и каким-то образом, если вы покидаете страницу и какое-то время находитесь в автономном режиме... Как, я не знаю.


person Karem    schedule 08.08.2010    source источник
comment
Pusher может решить эту проблему!   -  person gabitzish    schedule 30.07.2012


Ответы (7)


Facebook немного противен тем, что их страница содержит некоторый Javascript, который поддерживает открытое соединение с их чат-сервером. Как только соединение потеряно, это означает, что вы закрыли страницу (или подключение к Интернету) и отметили, что вы не в сети.

Обычно используется просто тайм-аут, который отмечает пользователя в автономном режиме через некоторое время после его последней активности/загрузки страницы. Разумным значением этого тайм-аута может быть, например, время, после которого истекает срок действия их cookie-файла сеанса.

person Wim    schedule 08.08.2010
comment
@Wim привет, я не совсем понимаю ваш метод sessiontimeout, как он должен запускать запрос ПОСЛЕ того, как пользователь покинул страницу и не нажал что-то? Может ли сервер выполнить запрос с тайм-аутом сеанса или? Не могли бы вы также привести небольшой пример - person Karem; 08.08.2010
comment
Ваша база данных содержит только время последнего посещения, а не фактическое поле онлайн/офлайн. Если вы хотите узнать статус онлайн/офлайн (например, во время загрузки страницы другого посетителя), получите время последнего доступа из базы данных и вычтите его из текущего времени, а затем сравните с вашим временем ожидания. - person Wim; 08.08.2010
comment
Вы также можете запускать периодическую задачу, которая помечает пользователей как не в сети, но накладные расходы на это, вероятно, намного хуже, чем на сравнение каждый раз, когда вы хотите узнать статус. - person Wim; 08.08.2010
comment
О, хорошо, я думаю, я понял, но я не знаю, как вычесть его из текущего времени и сравнить с вашим временем ожидания, LastTime-TimeNow = время ожидания, в кодировании, не могли бы вы привести пример этого, пожалуйста, спасибо. - person Karem; 08.08.2010
comment
Если $last_access — это время, которое вы получили из базы данных, а $timeout — время ожидания в секундах, пользователь будет отключен, если time() - $last_access > $timeout. - person Wim; 08.08.2010
comment
Спасибо, когда я сохраняю $last_access на каждой странице, он должен храниться вот так (формат unix) $last_acess = time(); ? спасибо, последний вопрос, прежде чем я попробую .. - person Karem; 08.08.2010
comment
Да, это самый простой способ, просто используйте time() и поле INTEGER в MySQL. Вы можете использовать поля DATETIME или TIMESTAMP, но тогда все становится сложнее. - person Wim; 09.08.2010
comment
Спасибо, он отлично работает с time(), и ваша идея сделать это действительно великолепна, я не могу найти ничего, что превзошло бы это ... просто и легко, еще раз спасибо - person Karem; 09.08.2010

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

Для лучшего решения (похожего на facebook) вам нужно использовать полупостоянные соединения и использовать их для обнаружения присутствия с большей степенью детализации.

person ggarber    schedule 08.08.2010

Что мне делать, когда пользователь покидает сайт, не выходя из системы (нажав на фактическую кнопку выхода)?

Ну, вы не можете обнаружить это. Лучшее, что вы можете сделать, это статистика «последний активный» или «пользователи, активные за последние несколько минут». В этом случае вы должны обновлять поле базы данных каждый раз, когда пользователь делает запрос страницы.

person Artefacto    schedule 08.08.2010
comment
@Null Я не вижу противоречия. Это именно то, что я сказал, за исключением того, что возрастные запросы принудительно устанавливаются с интервалом. - person Artefacto; 08.08.2010

Вы можете сохранить временную метку при загрузке страницы, а затем основывать статус онлайн/офлайн на количестве времени, прошедшего с тех пор.

person Derek H    schedule 08.08.2010

Например, вы можете иметь в пользовательской таблице поле с именем last_visit и обновлять его с помощью sysdate, now() и т. д., когда он обращается к любой странице...

В запросе, который дает вам онлайн-пользователей, вы будете фильтровать его с помощью пользователей, которые имеют в поле last_visit десять минут или меньше....

как:

where last_visit < today-(10 minutes)
person Garis M Suero    schedule 08.08.2010

Я думаю, вы должны сделать что-то похожее на AJAX push. @Wim также предлагает аналогичный подход.

person thelost    schedule 08.08.2010
comment
@Wim Спасибо, есть ли способ использовать их и в ответах? - person thelost; 09.08.2010
comment
Не то, что я знаю из. Вы можете опубликовать комментарий в ответе другого парня и там сослаться на свой собственный. - person Wim; 09.08.2010

Недавно я писал сайт на php в качестве хобби, что отличается от нормы, и я понял, что сеансы хранятся в файлах для:

  • Создайте отдельную таблицу и укажите идентификатор пользователя, время последнего обновления, идентификатор сеанса.
  • сохранить переменную в сеансе с именем last_active
  • На каждом вызове страницы проверьте, было ли последнее активное время менее 30 секунд (или что вы хотите), если оно больше, то обновите таблицу на первом шаге, если нет, продолжайте. Это избавляет вас от необходимости звонить на каждой странице и будет точным в течение минуты или около того.

Идентификатор сеанса в базе данных не нужен, просто приятно видеть, у кого какой идентификатор сеанса активен, я даже написал немного хакерской функции для удаления файлов сеанса на основе этого идентификатора вручную, если я хотел кого-то разлогинить ... никакой реальной причины для этого, просто немного забавы.

Конечно, если вы сохраняете сеансы в своей базе данных, это еще проще, так как вы в любом случае выполняете обход базы данных на каждой странице, поэтому ее обновление не является большой проблемой.

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

person Community    schedule 08.08.2010