Проверьте, какие пользователи онлайн
У меня есть переменная 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 каждую минуту. Почему таблица памяти? Потому что это быстро (немного увеличьте использование памяти), поэтому вы не почувствуете разницу, и в случае перезапуска сервера оно будет очищено автоматически.