Проверьте, какие пользователи онлайн

У меня есть переменная PHP $_SESSION с именем пользователя. У меня есть база данных MYSQL с уникальным полем для имени пользователя. Как я могу держать БД в курсе имен пользователей онлайн, а также удалять их, когда они уходят. Есть ли какой-нибудь способ, которым я мог бы сделать это с JQuery.ajax?

4 ответа

Решение

Я делаю это периодически пинговать специальный обработчик с помощью AJAX (один раз в 30 секунд). Это очень много запросов, поэтому вместо того, чтобы каждый раз обновлять таблицу пользователей онлайн с последним посещением, я обновляю memcache. Я обновляю запись базы данных только когда она на 5 минут отстает от записи memcache (вы можете выбрать большую или меньшую задержку в зависимости от нагрузки). Затем задание cron удаляет устаревшие записи из таблицы онлайн-пользователей.

Чтобы проверить, находится ли конкретный пользователь в сети, я просто проверяю его запись в memcache. Ошибка не более 30 секунд. База данных никогда не отстает более чем на 5 минут, поэтому ее результаты также довольно точны.

Я также использую эти периодические запросы для передачи событий пользователю.

Самый простой способ определить, когда я захожу в сеть, - это войти в систему. Вы можете добавить столбец в таблицу пользователей, который называется что-то вроде last_login или же last_seen и обновите этот столбец в момент успешного входа пользователя.

Если пользователь явно не выйдет из системы, будет очень трудно определить, находится ли пользователь в сети. Если вы не возражаете против дополнительной записи в базу данных, вы можете обновить last_seen столбец каждый раз, когда страница загружается, и вы делаете проверку входа в систему. Тогда вам нужно будет установить разумное время (15 минут, 30 минут?), Так как время, которое пользователь все еще может быть там.

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

  • пользователь может иметь несколько открытых окон / вкладок
  • пользователь может отключить JavaScript
  • пользователь мог потерять подключение к интернету
  • и т.п.

Для входа пользователей вы можете опрашивать запросы к серверу, обновлять отметку времени. Через фиксированный интервал времени, скажем, 5 минут, у вас есть задание cron, которое удаляет записи из онлайн-таблицы пользователей, чья метка времени старше 5 минут.

В случае, если пользователь вышел из системы, вы можете напрямую удалить запись из онлайн-таблицы пользователей. Для большей точности вы можете уменьшить интервал до 2 минут.

Самый простой способ - создать таблицу MySQL MEMORY, в которую необходимо добавлять / обновлять записи при каждом новом запросе (для каждого пользователя). Уникальный ключ для таблицы должен быть идентификатором сеанса, и у вас также должен быть столбец отметки времени (при обновлении / вставке). И если вы хотите, вы можете добавить столбец userID на тот случай, если вам нужна некоторая информация о пользователе (имя пользователя в вашем случае). Затем используйте cron job, чтобы удалить все записи старше, чем, например, 5 минут. Вы можете изменить это значение, но запускать cron каждую минуту. Почему таблица памяти? Потому что это быстро (немного увеличьте использование памяти), поэтому вы не почувствуете разницу, и в случае перезапуска сервера оно будет очищено автоматически.

Другие вопросы по тегам