Как отслеживать онлайн-статус пользователей моего веб-сайта?
Я хочу отслеживать пользователей, которые сейчас находятся в сети.
Определение "быть в сети" - это когда они находятся на индексной странице веб-сайта,
имеет функцию чата.
До сих пор все, что я могу придумать, - это настроить cookie для пользователя, и когда cookie будет найден при следующем посещении, будет сделан ajax-вызов для обновления таблицы с их именем пользователя, их статусом в сети и временем.
Теперь мой реальный вопрос, как я могу надежно отключить их статус, когда они уходят
веб-сайт? Единственное, о чем я могу думать, - установить заданное количество времени без взаимодействия с пользователем, а затем отключить статус.
Но я действительно хочу сохранить статус до тех пор, пока они находятся на сайте, с или без взаимодействия, и только отключаются, когда покидают сайт.
Ответы
Ответ 1
Полное решение. С начала до конца.
Если вы хотите, чтобы это работало на странице index.php, вы могли бы асинхронно отправлять обновления на сервер (тип AJAX), предупреждая сервер, что $_SESSION["userid"]
все еще находится в сети.
setInterval("update()", 10000); // Update every 10 seconds
function update() {
$.post("update.php"); // Sends request to update.php
}
В файле update.php будет такой код:
session_start();
if ($_SESSION["userid"])
updateUserStatus($_SESSION["userid"]);
Все это предполагает, что вы храните свой userid как переменную сеанса, когда пользователи заходят на ваш сайт. Функция updateUserStatus() - это простой запрос, например:
UPDATE users
SET lastActiveTime = NOW()
WHERE userid = $userid
Таким образом, вы будете заботиться о своем хранилище. Теперь, чтобы получить список пользователей, которые являются "онлайн". Для этого вам понадобится другой вызов jQuery и другой вызов setInterval():
setInterval("getList()", 10000) // Get users-online every 10 seconds
function getList() {
$.post("getList.php", function(list) {
$("listBox").html(list);
});
}
Эта функция запрашивает бит HTML-формы сервера каждые 10 секунд. Страница getList.php будет выглядеть так:
session_start();
if (!$_SESSION["userid"])
die; // Don't give the list to anybody not logged in
$users = getOnlineUsers(); /* Gets all users with lastActiveTime within the
last 1 minute */
$output = "<ul>";
foreach ($users as $user) {
$output .= "<li>".$user["userName"]."</li>";
}
$output .= "</ul>";
print $output;
Это приведет к отображению следующего HTML:
<ul>
<li>Jonathan Sampson</li>
<li>Paolo Bergantino</li>
<li>John Skeet</li>
</ul>
Этот список включен в переменную jQuery с именем "list". Посмотрите назад в наш последний блок jQuery, и вы увидите его там.
jQuery возьмет этот список и поместит его в div, имеющее имя класса "listBox".
<div class="listBox"></div>
Надеюсь, вам это поможет.
Ответ 2
В общем случае нет способа узнать, когда пользователь покидает вашу страницу.
Но вы можете делать вещи за кулисами, чтобы они часто загружали что-то с вашего сервера, пока они находятся на странице, например. загружая <iframe>
с некоторым содержимым, которое перезагружается каждую минуту:
<meta http-equiv="refresh" content="60">
Это вызовет небольшую дополнительную нагрузку на сервер, но будет делать то, что вы хотите (если не ко второму).
Ответ 3
Как работает функция чата? Это чат-система на основе ajax?
Системы чата, основанные на Ajax, работают клиентами, последовательно ударяя по серверу чата, чтобы узнать, есть ли в очереди новые сообщения. Если это так, вы можете обновить онлайн-статус пользователя либо в cookie, либо в PHP-сессии (при условии, что вы используете PHP, конечно). Затем вы можете установить онлайн-тайм-аут на несколько больше, чем частота обновления.
То есть, если ваша чат-система обычно запрашивает новые сообщения с сервера каждые 5 секунд, вы можете предположить, что любой пользователь, который не отправил запрос на 10-15 секунд, больше не находится на странице чата.
Если вы не используете чат-систему на основе ajax (возможно, Java или что-то еще), то вы все равно можете сделать то же самое, добавив запрос ajax, который периодически выходит на сервер, чтобы установить, находится ли он в сети.
Я бы не предложил хранить эту информацию о статусе онлайн в базе данных. Запросить базу данных каждые пару секунд, чтобы увидеть, кто в сети, а кто нет, очень ресурсоемкий, особенно если это большой сайт. Вы должны кэшировать эту информацию и работать с кешем (очень быстро) по сравнению с базой данных (очень медленно по сравнению).
Ответ 4
Вопрос помечен как "jquery" - как насчет решения javascript? Вместо meta/refresh вы можете использовать window.setInterval(), выполнить ajax-запрос и предоставить что-то "полезное", например, обновленный список "кто онлайн" (если вы считаете это полезным; -))
Ответ 5
Я не пробовал это, поэтому возьмите его с солью: установите обработчик событий для window.onunload, который уведомляет сервер, когда пользователь покидает страницу. Некоторые проблемы с этим: 1.) событие не срабатывает при сбое браузера или компьютера и 2.) если у пользователя есть два экземпляра индексной страницы, которые открываются и закрываются, они будут выходить из системы, если вы не реализуете подсчет ссылок, Само по себе это не является надежным, но в сочетании с методом опроса Джонатана, должно позволить вам иметь довольно хорошее время отклика и большие интервалы между обновлениями.