Список пользователей, находящихся на сайте прямо сейчас, — функция, востребованная и в закрытых сообществах, и как элемент социального доказательства ("на сайте сейчас 40 человек") в интернет-магазине. Разберём, как реализовать это в 1С-Битрикс.
Штатный модуль статистики
Модуль веб-статистики Битрикса хранит данные о визитах, включая информацию об авторизованных пользователях, — раздел Аналитика → Мониторинг → Онлайн в административной панели показывает список пользователей и гостей с активностью за последние минуты без необходимости писать собственный механизм отслеживания с нуля.
Программное получение списка активных пользователей
<?php
use Bitrix\Main\Loader;
Loader::includeModule('statistic');
$result = CUserOnlineFilter::GetList(
[], ['ONLINE' => 'Y'], false, false, ['USER_ID', 'FULL_NAME', 'PARAMS']
);
while ($row = $result->Fetch()) {
echo $row['FULL_NAME'] . PHP_EOL;
}
Класс модуля статистики даёт программный доступ к тому же списку, что виден в административной панели, — полезно для вывода счётчика или списка активных пользователей прямо на публичной части сайта, а не только для внутреннего просмотра администратором.
Нужна помощь с Битрикс?
Определение "онлайн" по таймауту активности
Пользователь считается онлайн не в буквальном смысле открытой вкладки браузера, а по факту недавней активности — обращения к серверу в пределах заданного временного окна (обычно несколько минут). Это означает, что счётчик всегда несколько приблизителен: пользователь, закрывший вкладку минуту назад, ещё какое-то время продолжает считаться "онлайн", пока не истечёт таймаут.
Собственная реализация без модуля статистики
<?php
use Bitrix\Main\Data\Cache;
global $USER;
if ($USER->IsAuthorized()) {
$cache = new CPHPCache;
$key = 'user_last_seen_' . $USER->GetID();
// сохранение метки времени последней активности,
// например через CUserOptions или отдельную таблицу
CUserOptions::SetOption('online', 'last_seen', time(), false, $USER->GetID());
}
Для нестандартных требований (например, показ статуса "онлайн" в чате поддержки с более точной детализацией, чем даёт штатный модуль) можно реализовать собственный механизм отметки активности, записывая метку времени при каждом обращении и сравнивая её с текущим временем при выводе — но для большинства типовых сценариев штатный модуль статистики закрывает задачу без дополнительного кода.
Производительность при частой проверке статуса
Если статус "онлайн" запрашивается очень часто (например, live-обновление списка активных пользователей через AJAX-опрос каждые несколько секунд), стоит учитывать нагрузку от таких частых запросов на базу данных — на проекте с высокой посещаемостью и активным использованием этой функции разумно кешировать результат на короткий срок (несколько секунд) вместо выполнения запроса на каждое обращение без исключения.
Приватность и отображение "онлайн" другим пользователям
Публичный показ статуса "онлайн" конкретного пользователя другим посетителям — не всегда желаемое поведение с точки зрения приватности: некоторые пользователи предпочли бы не показывать свою активность окружающим. Для сайтов с чувствительной аудиторией стоит предусмотреть настройку, позволяющую пользователю скрыть свой статус "онлайн" от других, а не считать его видимым по умолчанию для всех без исключения.
Частые ошибки
- Собственная реализация написана с нуля без проверки штатного модуля статистики. Дублирование уже существующей функциональности без реальной необходимости.
- Частый AJAX-опрос статуса без кеширования на короткий срок. Излишняя нагрузка на базу при высокой посещаемости.
- Нет возможности скрыть свой статус онлайн другим пользователям. Вопрос приватности не рассматривается при проектировании функции.
Итог
Штатный модуль веб-статистики уже содержит данные об активных пользователях, доступные и через административную панель, и программно через API модуля — для большинства сценариев реализовывать собственный механизм отслеживания активности с нуля не требуется. Статус "онлайн" определяется по недавней активности с приблизительной точностью, а не по факту реально открытой вкладки браузера.
