базовый курс

ГРУППА КУРСА

Пользователи онлайн

Принцип реализации

На многих сайтах есть необходимость определять, какие пользователи в данный момент находятся на связи. Например, это используется в социальных сетях. Эта функция реализуется так: каждый пользователь регулярно отправляет на сервер информацию о том, что он в сети. Время этого сообщения записывается в БД. Если пользователь отправлял это сообщение совсем недавно, то считается что он в сети. Таким образом, реализация данной функции состоит из двух частей:

  1. Каждый пользователь обновляет время сообщения о том, что пользователь онлайн
  2. Для нужных пользователей проверяется, когда они обновляли время сообщения. Тот, кто обновлял недавно - в сети. Кто не обновлял некоторое время - не в сети.

Для реализации этой функции в таблице с пользователями должно быть поле, куда записывается время обновления информации.

Обновление информации

Это действие можно выполнить двумя способами. Простой вариант заключается в том, что информация обновляется при переходе по страницам. Но этот способ имеет недостаток. Пользователь может долго находиться на одной странице и не переходить по другим страницам. Тогда информация о том, что он на связи, не обновляестя и будет указано, что он вышел с сайта. А если увеличить время, в течении которого пользователь считается онлайн, то получится противоположная ситуация. Пользователь уже вышел с сайта, но ещё долго считается, что он в сети. Оптимально подобрать время достаточно сложно.

Более сложный способ состоит в использовании AJAX. На каждой странице сайта должен быть скрипт, который регулярно обновляет информацию в БД. При этом Вы точно знаете, через какие промежутки времени происходит обновление информации. Мы рассмотрим оба способа.

В базе данных дожна быть таблица users с информацией о пользователях. Добавим в неё поле online. В него будет записываться время обновления информации. Будем записывать его в фомате Unix, то есть в секундах. Поэтому поле имеет тип INT.

Страницы сайта должны быть такие:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
header('Content-type: text/html; charset=utf-8');
$user_id = 2; //берётся из сессии
$current = time();
$db = mysqli_connect('localhost', 'root', '', 'mybase');
$query = "UPDATE users SET online=$current WHERE id=$user_id";
$result = mysqli_query($db, $query);
?>
<!DOCTYPE html>
<html>
<head>
<title>Страница</title>
<meta charset="utf-8">
</head>
<body>
<p>Содержимое страницы</p>
</body>
</html>

В строке 3 создаётся переменная $user_id, в которую записано id пользователя. На практике id записывается в сессию при авторизации, а в этом скрипте он должен быть получен из сессии.

В остальном скрипт понятен. В переменную $current записывается текущее время и отправляется в БД, в поле online. Так должны выглядеть все страницы сайта. Когда пользователь переходит на любую страницу, время в поле online обновляется.

Для второго способа Вы должны зать технологию AJAX. Вместо предложенного выше кода на каждой странице сайта должет быть скрипт, регулярно отправляющий запросы на сервер. Он выглядит так:

JavaScript:

+
1
2
3
4
5
6
7
8
<!DOCTYPE html>
<html>
<head>
<title>Страница</title>
<meta charset="utf-8">
</head>
<body>
<script>
9
10
11
12
13
14
15
16
17
18
function online ()
  {
  var ntime = new Date();
  var current = ntime.getTime();
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'infonline.php?current='+current, true);
  xhr.send();
  }
online();
setInterval(online, 40000);

Если Вы изучали AJAX, то этот код должен быть Вам понятен. К запросу добавлено текущее время. Но оно добавлено не для использования на сервере, а для предотвращения кеширования запроса. Первый вызов функции производится в строке 17. Затем, в строке 18 она запускается в функции setInterval(). Так сделано для того, чтобы первый запрос отправлялся сразу после загрузки страницы. Ведь setInterval() первый раз запускает функцию только через указанный интервал. Приведённый скрипт отправляет запросы на сервер каждые 40 секунд.

На сервере запускается скрипт infonline.php. Он точно такой же, как на странице в первом примере. Только в нём не должно быть HTML тегов.

Вывод пользователей онлайн

Данные о том, кто находится онлайн, используется по-разному. На каких-то сайтах просто выводится списох всех пользователей онлайн. На других выводится разная информация о конкретных пользователях и указывается, находятся ли они на сайте. При любом варианте используется один принцип - нужно получить текущее время и сравнить со временем в базе данных. Если разница небольшая, значит пользователь онлайн. В нашем примере данные обновляются каждые 40 секунд. Значит при разнице в 50 секунд можно считать, что пользователь вышел с сайта. Если данные обновляются без AJAX, то интервал подобрать сложнее. Вы должны сами определить, сколько времени в среднем пользователь находится на одной странице.