Как организовать проверку присутствия зарегистрированного пользователя на сайте?

Пишу движок для своего блога. И хотелось бы добавить проверку присутствия зарегистрированных пользователей на сайте, что бы можно было выводить статус онлайн\оффлайн. Интересует сам подход к такого рода вещам. Нужна ли для этого отдельная таблица в базе? Или достаточно выделенного столбца в таблице user? Движок пишу на yii2 и возможно есть уже готовые модули для этого, но хотелось бы сделать это самому. Так же интересует каким образом обновлять статус онлайн\оффлайн, если пользователь не выходил по кнопке logout к примеру, а просто закрыл вкладку в браузере или время его сессии истекло.
  • Вопрос задан
  • 2632 просмотра
Решения вопроса 1
Запоминаем время последнего запроса юзера (last_request_time). Когда требуется узнать онлайн он или нет прибавляем к last_request_time, скажем, 10 минут.
last_request_time + 10 мин > current_time === юзер онлайн

Если этого не достаточно раз в N секунд/минут стучим с клиента для обновления last_request_time
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
KorsaR-ZN
@KorsaR-ZN
Если не нужна точность, а будет достаточно скажем 15 мин, то я бы вариант из предыдущего ответа немного подправил, если last_request_time, обновляется с каждым новым запросом пользователя, то это лишний update в базу, а это не зачем так часто делать.

Тогда лучше сделать так:
В сессию пользователя храним дату последнего обновления состояния в БД, и каждый новый запрос проверяем его (online_expire < currentTime), если пора обновлять состояние, то в базе обновляем колонку (online_expire = currentTime + 15), ну и в сессии тоже обновляем online_expire = currentTime + 15 мин.

И потом в модуле вывода онлайн пользователей, выводим всех онлайн у кого online_expire < currentTime.

Т.е. почти тоже самое, что из предыдущего ответа, только без постоянного update в базу...
Ответ написан
Комментировать
akubintsev
@akubintsev
Опытный backend разработчик
Есть вариант с использованием websockets. Он даёт самую большую точность по детектированию онлайна и наименьшие затраты по ресурсам системы, поскольку веб-сокеты удерживают соединения и имеют состояния.
Подойдёт из php библиотека Ratchet. Либо можно взять node.js или в python Tornado
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы