Что состоит в том, чтобы определить самый легкий путь, онлайн ли пользователь? (PHP/MYSQL)

ИСПОЛЬЗОВАНИЕ шаблонов проектирования и документации

в веб-разработке, что использование этих вещей никогда не чувствовал никакого использования

37
задан Hmmm 23 January 2016 в 07:30
поделиться

8 ответов

Не утруждайтесь выяснением разницы между часовыми поясами. В этом нет необходимости.

Каждый раз, когда пользователь обращается к странице, обновите поле в его записи в таблице Users, время последнего обновления. Затем выполните запрос для всех пользователей, у которых время последнего обновления было в течение последних 5 минут. Что-то большее, чем это, и они считаются «офлайн».

Если вы используете время вашего сервера с помощью функции NOW () в MySQL, вы будете обходить стороной вычисление разницы между часовыми поясами.

стандартный способ отслеживания количества пользователей, находящихся в настоящее время в сети (то есть активных в течение последних двух минут).

Постоянно обновляется

Если вы хотите знать, что они все еще активны, даже если они не переходят со страницы на страница добавьте немного javascript для проверки связи с вашим сервером каждые 60 секунд или около того, чтобы вы знали, что они все еще живы. Он будет работать так же, как и мое первоначальное предложение, но он обновит ваши записи, не требуя от них отчаянного просмотра вашего сайта хотя бы раз в пять минут.

var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);
89
ответ дан 27 November 2019 в 04:14
поделиться

Похоже, ваша логика сравнения "человек в сети" не принимает во внимание часовые пояса. Если вы имеете дело с часовыми поясами таким образом, я настоятельно рекомендую вам сохранять все свое время в GMT и преобразовывать их в местное время для ваших пользователей прямо перед их отображением. Это сделает любые операции сравнения очень простыми.

Здесь .

есть хорошая SO-ветка о часовых поясах .
2
ответ дан 27 November 2019 в 04:14
поделиться

Сохраните часовой пояс в таблице и используйте его в вычислениях, чтобы найти местное время пользователя по сравнению с местным временем пользователя, просматривающего страницу.

Изменить:

Еще лучше хранить все времена как серверное время и основывать все вычисления только на серверном времени.

1
ответ дан 27 November 2019 в 04:14
поделиться

В зависимости от вашей ситуации, вам может быть лучше создать отдельную таблицу «who-online» со столбцами: «ip» и «last-updated-time» и запрашивать / обновлять эту таблицу каждый раз, когда пользователь загружает страницу.

Запросы о загрузке страницы могут включать :

  1. Обновление / вставка таблицы «чей-онлайн» для текущего пользователя на основе IP.
  2. Удалить » «просроченные» строки (также можно периодически выполнять с помощью cronjob).
  3. Подсчет «активных» пользователей.

Преимущества использования этого метода :

  1. Если пользователь не вошел в систему, он / она все еще остается подсчитывается / отслеживается.
  2. В зависимости от количества пользователей, запрос к этой таблице может быть быстрее.

Примечание:Если вы используете это, вы должны принять во внимание, что при любом просмотре страницы в вашей таблице будет создана строка, поэтому в зависимости от агента пользователя вы можете игнорировать ботов или считать только популярных (Firefox, IE, Safari, Opera и т. Д.).

0
ответ дан 27 November 2019 в 04:14
поделиться

Решение, которое я реализовал для этого, заключается в том, чтобы при каждой загрузке страницы аутентифицированным пользователем устанавливать / сбрасывать переменную кэша памяти, такую ​​как "user_ {userid} isonline" => истина и истекает через 5 минут. Затем проверьте, есть ли переменная в кеше, когда я получаю доступ к информации пользователя. В зависимости от размера вашей пользовательской базы, если вы хотите получить список всех, кто находится в сети, вы можете использовать вызов memcache getmulti с массивом ключей «user {userid} _isonline» для всех ваших пользователей.

, конечно, это действительно зависит от того, как часто пользователь будет менять страницы на вашем сайте ... чтобы получить более точное представление о пользователях в сети, вы можете реализовать вызов ajax xmlhttprequest на своей странице, выполняющийся с небольшим интервалом (30 секунд или около того), который сбрасывает переменную кэша памяти, и срок действия переменной memcache истечет за меньшее время (1 минута для учета возможных проблем с браузером). Это НЕ СОВЕРШЕННО точно, но поскольку http не имеет постоянного соединения с сервером, вы весьма ограничены в своих возможностях.

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

0
ответ дан 27 November 2019 в 04:14
поделиться

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

Единственное, что вы могли бы сделать, - это включить JavaScript на вашей веб-странице, чтобы регулярно отправлять запросы AJAX на ваш сервер, которые включают идентифицирующую информацию и другой запрос AJAX, когда пользователь покидает страницу, используя window.onbeforeunload .

5
ответ дан 27 November 2019 в 04:14
поделиться

Я бы посоветовал хранить такую ​​информацию в память с, например, memcached или mysql heap или redis. Потому что в противном случае база данных сильно пострадает.

2
ответ дан 27 November 2019 в 04:14
поделиться

Мой путь может быть не лучшим способом, но поскольку мой сайт и база пользователей находятся в базе данных mysql, когда пользователь входит на мой сайт, находятся в сети

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

    . Затем у меня есть задание cron, которое запускается каждые 10-15 минут, которое удаляет любые использования из онлайн-таблицы и отмечает там пользовательскую таблицу как офлайн, если онлайн-время обновилось в течение X минут

    4
    ответ дан 27 November 2019 в 04:14
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: