Уявіть: картка товару показує «Зараз дивляться 42 особи», а реальних відвідувачів на сайті — три. Через ботів і неоптимізований лічильник дані спотворюються, довіра падає, а сервер захлинається запитами. Ми налаштовували такий механізм десятки разів — від невеликих каталогів до проектів з мільйоном відвідувачів на місяць. Підхід має бути швидким, правдоподібним і не навантажувати сервер. Економія серверних ресурсів при використанні Redis замість MySQL — до 40%. Наприклад, для магазину з 10 000 унікальних відвідувачів на день використання Redis зменшує витрати на серверні ресурси на $20–50 на місяць.
Типові проблеми: застарілі дані (якщо оновлювати раз на хвилину — цифри втрачають актуальність), навантаження на БД при кожному запиті, спотворення статистики ботами. Без правильної фільтрації ботів лічильник може показувати 100+ «осіб», коли реальних відвідувачів одиниці. Оптимальне вікно активності — 5–10 хвилин, а мінімальний поріг виведення — 2 особи.
Як визначити «зараз дивляться»
Поняття «дивиться прямо зараз» — умовне. На практиці рахують користувачів, які відкрили сторінку товару за останні 2–15 хвилин (магазин обирає вікно самостійно). Типовий вибір: 5–10 хвилин.
Для зберігання активних переглядів використовується одна з двох стратегій: Варіант 1 — таблиця в MySQL/PostgreSQL. Створюється таблиця bl_product_viewers:
SQL код
CREATE TABLE bl_product_viewers ( id INT AUTO_INCREMENT PRIMARY KEY, product_id INT NOT NULL, session_id VARCHAR(64) NOT NULL, last_seen DATETIME NOT NULL, INDEX idx_product_time (product_id, last_seen) ); При кожному перегляді вставляється або оновлюється запис по (product_id, session_id). Для підрахунку: SELECT COUNT(DISTINCT session_id) WHERE product_id = ? AND last_seen > NOW() - INTERVAL 5 MINUTE. Агент очищення раз на 10 хвилин чистить застарілі записи.
Варіант 2 — Redis. Ключ viewers:product:{id} — це sorted set, де score = timestamp останнього візиту, member = session_id. Підрахунок: ZCOUNT viewers:product:123 (NOW-300) +inf. Застарілі записи видаляються через ZREMRANGEBYSCORE. Це швидше і не навантажує БД, але потребує Redis на сервері.
Чому варто використовувати Redis?
Redis забезпечує швидкість запису та читання менше 1 мс, що критично при тисячах одночасних переглядів. Він не навантажує MySQL, зберігаючи дані в оперативній пам'яті. Це знижує витрати на серверні ресурси та пришвидшує відгук AJAX-запитів. Redis обробляє запити в 5 разів швидше за MySQL.
Як реалізувати на стороні Бітрікс
У component_epilog.php детальної сторінки товару записується візит:
$productId = $arResult["ID"]; $sessionId = session_id(); $now = date("Y-m-d H:i:s"); $DB->Query("INSERT INTO bl_product_viewers (product_id, session_id, last_seen) VALUES (" . intval($productId) . ", '" . $DB->ForSql($sessionId) . "', '" . $now . "') ON DUPLICATE KEY UPDATE last_seen = '" . $now . "'"); Підрахунок активних переглядів виноситься в окремий AJAX-контролер — не варто робити SELECT в epilog, інакше кожен запит сторінки гальмуватиме на читанні.
Детальніше про роботу з component_epilog.
Як реалізувати AJAX-оновлення лічильника
Лічильник оновлюється на клієнті без перезавантаження сторінки. JavaScript-компонент робить запит кожні 30–60 секунд:
setInterval(() => { fetch('/ajax/product-viewers/?id=' + productId) .then(r => r.json()) .then(data => { if (data.count > 1) { document.querySelector('.viewers-count').textContent = 'Зараз дивляться: ' + data.count; } }); }, 30000); AJAX-обробник у Бітрікс реєструється через CModule::AddAutoloadClasses() або як окремий PHP-файл з включенням ядра через require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'.
Як виключити ботів з лічильника?
Ботів фільтрують за User-Agent у component_epilog.php перед записом. Використовуйте регулярний вираз, який перевіряє наявність рядків bot, crawler, spider тощо в заголовку. Це обов'язковий крок — без нього цифри завищуються на 30–40%. Для правильного налаштування сповіщення «дивляться товар» використовуйте фільтрацію ботів. Для вбудованих механізмів Бітрікс можна використовувати BITRIX_SESSID та перевірку IsUserAuthorized, але це не захищає від пошукових ботів.
Покрокова інструкція налаштування
- Вибір сховища: MySQL або Redis. Для малих проектів підійде MySQL, для високонавантажених — Redis.
- Створення структури даних: таблиці або Sorted Set у Redis.
- Реєстрація візиту: у
component_epilog.phpз фільтрацією ботів. - AJAX-контролер: повертає JSON з кількістю активних переглядів.
- Клієнтський JS: оновлює лічильник кожні 30 секунд.
- Агент очищення: для MySQL — SQL-запит, для Redis —
EXPIREабо фонове очищення. - Налаштування порогів та відмінків: для гарного виведення.
Порівняння способів зберігання
| Параметр | MySQL/PostgreSQL | Redis |
|---|---|---|
| Швидкість запису | ~5 ms | <1 ms |
| Швидкість читання | ~3 ms (з індексом) | <0.5 ms |
| Навантаження на сервер | Середнє (диск I/O) | Низьке (RAM) |
| Вимоги | База даних | Встановлення Redis |
| Масштабованість | Горизонтально | Вертикально |
Етапи налаштування
| Етап | Опис | Час |
|---|---|---|
| Аналіз | Вибір вікна активності, визначення навантаження | 2 години |
| Проектування | Вибір сховища (MySQL/Redis), схема таблиці | 1 година |
| Реалізація | Запис візитів, AJAX-контролер, JS-компонент | 4-6 годин |
| Тестування | Перевірка з ботами, навантажувальне тестування | 2 години |
| Деплой | Розміщення агента, налаштування кешування | 1 година |
Що входить у налаштування
- Створення таблиці
bl_product_viewers(або налаштування Redis-ключів) - Запис візитів у
component_epilog.phpз фільтрацією ботів - AJAX-контролер для отримання актуальної кількості переглядів
- JavaScript-компонент з періодичним оновленням лічильника
- Агент очищення для видалення застарілих записів
- Виведення блоку з правильними умовами (поріг, відмінювання)
Ми надаємо гарантію якості на всі роботи. Використання механізму терміновості підвищує конверсію картки товару. Звертайтеся до нас — ми реалізуємо цей механізм під ключ за 1–3 дні. Наша команда має більше 5 років досвіду з 1С-Бітрікс і десятки успішних проектів з кастомними лічильниками. Замовте налаштування — отримайте робочий лічильник за 24 години. Отримайте консультацію щодо вашого магазину.
Зв'яжіться з нами для консультації.







