Как отслеживать онлайн-статус пользователей моего веб-сайта?

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

Определение "быть в сети" - это когда они находятся на индексной странице веб-сайта, имеет функцию чата.

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