ИСПОЛЬЗОВАНИЕ шаблонов проектирования и документации
в веб-разработке, что использование этих вещей никогда не чувствовал никакого использования
Не утруждайтесь выяснением разницы между часовыми поясами. В этом нет необходимости.
Каждый раз, когда пользователь обращается к странице, обновите поле в его записи в таблице Users, время последнего обновления. Затем выполните запрос для всех пользователей, у которых время последнего обновления было в течение последних 5 минут. Что-то большее, чем это, и они считаются «офлайн».
Если вы используете время вашего сервера с помощью функции NOW () в MySQL, вы будете обходить стороной вычисление разницы между часовыми поясами.
стандартный способ отслеживания количества пользователей, находящихся в настоящее время в сети (то есть активных в течение последних двух минут).
Если вы хотите знать, что они все еще активны, даже если они не переходят со страницы на страница добавьте немного javascript для проверки связи с вашим сервером каждые 60 секунд или около того, чтобы вы знали, что они все еще живы. Он будет работать так же, как и мое первоначальное предложение, но он обновит ваши записи, не требуя от них отчаянного просмотра вашего сайта хотя бы раз в пять минут.
var stillAlive = setInterval(function () {
/* XHR back to server
Example uses jQuery */
$.get("stillAlive.php");
}, 60000);
Похоже, ваша логика сравнения "человек в сети" не принимает во внимание часовые пояса. Если вы имеете дело с часовыми поясами таким образом, я настоятельно рекомендую вам сохранять все свое время в GMT и преобразовывать их в местное время для ваших пользователей прямо перед их отображением. Это сделает любые операции сравнения очень простыми.
Здесь .
есть хорошая SO-ветка о часовых поясах .Сохраните часовой пояс в таблице и используйте его в вычислениях, чтобы найти местное время пользователя по сравнению с местным временем пользователя, просматривающего страницу.
Изменить:
Еще лучше хранить все времена как серверное время и основывать все вычисления только на серверном времени.
В зависимости от вашей ситуации, вам может быть лучше создать отдельную таблицу «who-online» со столбцами: «ip» и «last-updated-time» и запрашивать / обновлять эту таблицу каждый раз, когда пользователь загружает страницу.
Запросы о загрузке страницы могут включать :
Преимущества использования этого метода :
Примечание:Если вы используете это, вы должны принять во внимание, что при любом просмотре страницы в вашей таблице будет создана строка, поэтому в зависимости от агента пользователя вы можете игнорировать ботов или считать только популярных (Firefox, IE, Safari, Opera и т. Д.).
Решение, которое я реализовал для этого, заключается в том, чтобы при каждой загрузке страницы аутентифицированным пользователем устанавливать / сбрасывать переменную кэша памяти, такую как "user_ {userid} isonline" => истина и истекает через 5 минут. Затем проверьте, есть ли переменная в кеше, когда я получаю доступ к информации пользователя. В зависимости от размера вашей пользовательской базы, если вы хотите получить список всех, кто находится в сети, вы можете использовать вызов memcache getmulti с массивом ключей «user {userid} _isonline» для всех ваших пользователей.
, конечно, это действительно зависит от того, как часто пользователь будет менять страницы на вашем сайте ... чтобы получить более точное представление о пользователях в сети, вы можете реализовать вызов ajax xmlhttprequest на своей странице, выполняющийся с небольшим интервалом (30 секунд или около того), который сбрасывает переменную кэша памяти, и срок действия переменной memcache истечет за меньшее время (1 минута для учета возможных проблем с браузером). Это НЕ СОВЕРШЕННО точно, но поскольку http не имеет постоянного соединения с сервером, вы весьма ограничены в своих возможностях.
ЕСЛИ вам требуется до второго представления того, кто находится в сети, вы могли бы иметь флэш-приложение, загруженное на вашу страницу, которое подключается к jabber-серверу, а затем просто проверьте, вошел ли этот конкретный пользователь в систему на сервере.
То, о чем вы просите (после разъяснения), по определению невозможно. HTTP - это протокол без установления соединения, поэтому, как только пользователь переходит на страницу и весь контент возвращается с сервера в браузер пользователя, между ними нет связи. Кто-то находится «в сети» с вашим сайтом менее секунды.
Единственное, что вы могли бы сделать, - это включить JavaScript на вашей веб-странице, чтобы регулярно отправлять запросы AJAX на ваш сервер, которые включают идентифицирующую информацию и другой запрос AJAX, когда пользователь покидает страницу, используя window.onbeforeunload .
Я бы посоветовал хранить такую информацию в память с, например, memcached или mysql heap или redis. Потому что в противном случае база данных сильно пострадает.
Мой путь может быть не лучшим способом, но поскольку мой сайт и база пользователей находятся в базе данных mysql, когда пользователь входит на мой сайт, находятся в сети
Затем при каждой загрузке страницы я проверяю онлайн-сеанс времени, если он существует, я проверяю, сколько ему лет, если ему меньше 5 минут, я ничего не делаю, если он старше 5 минут, затем я снова обновляю время сеанса, используя текущее время, а также обновляю таблицу онлайн-пользователей со временем
. Затем у меня есть задание cron, которое запускается каждые 10-15 минут, которое удаляет любые использования из онлайн-таблицы и отмечает там пользовательскую таблицу как офлайн, если онлайн-время обновилось в течение X минут