Pull to refresh
VK
Building the Internet

Способы подсчета статистики посещения страниц сайта «на лету»

VK corporate blog
Часто возникает задача подсчета количества посещений той или иной страницы портала или подсчета кликов по какой-то ссылке. Например. может быть интересно подсчитать количество просмотров статьи или объявления, число кликов по «показать номер телефона» на странице объявления о продаже и т.д. и т.п.

Главное точно понимать, для чего вы планируете использовать эти счетчики и для чего они могут понадобиться в обозримом будущем. Нужно ли по ним выбирать/сортировать/группировать сущности или вам просто нужны редкие разовые отчеты (например раз в сутки)? А может, вы хотите показывать эти счетчики в админке или в личном кабинете пользователя? Хотите ли вы в реальном времени показывать эти числа или можно ограничиться часовой/суточной отсечкой? В зависимости от этих и, возможно, еще каких-то критериев будет зависеть выбор способа подсчета и хранения счетчиков.

Подсчет кликов/визитов

Задачу подсчета кликов/визитов можно решать разными способами:
  • при посещении страницы или при обращении к какому-то URL делать +1 к счетчику;
  • периодически просматривать логи Web-сервера и считать число обращений к нужным URL-ам;
  • делать через redirect со специального URL-а, и перед редиректом делать +1 (но это, как вы понимаете, работает не во всех случаях);
  • с помощью JavaScript обращаться к URL счетчика при каком-то событии;
  • другие способы, на которые хватит фантазии.


На данном этапе необходимо решить, нужно ли нам считать визиты поисковых роботов. Возможно, вы не захотите считать запросы, совершаемые из внутренней сети. Также может быть интересным считать только запросы авторизованных пользователей и т.д.

Также важно понять, насколько критична точность подсчета, можно ли ошибиться на 1-2-3 единицы или нет. От этого может зависеть многое. Если важна точность, то можно пренебречь производительностью, или же наоборот, если важна производительность (например, скорость отдачи страницы), то можно незначительно пренебречь точностью.

Хранение счетчиков

Хранить счетчики можно тоже по-разному:
  • в базе данных в виде числового поля прямо в таблице сущности/страницы;
  • в базе данных в отдельной таблице, созданной специально для счетчиков, но также в виде простого числового поля;
  • сгруппировать разные счетчики, засериализовать их и также хранить в базе в BLOB или varchar-поле;
  • в какой-либо NoSQL базе, например, как Id -> count;
  • комбинация memcache + СУБД;
  • в файлах. Тут уж кто во что горазд, можно в одном файле в сериализованном виде, можно по файлу на сущность. В общем, можно много чего придумать, вплоть до реализации своей простой СУБД для хранения счетчиков.


Пример из жизни

Давайте рассмотрим конкретный пример из нашей практики. Сразу скажу, что мы используем MySQL.

Задача: подсчет числа визитов страницы объявления раздела Купля-продажа проекта Авто Mail.Ru, без учета Web-ботов (Google, Яндекс, Поиск Mail.Ru). Также нужно считать, общее количество просмотров всех объявлений автосалона публикующего свои объявления о продаже на нашем портале Авто Mail.Ru.

Важные моменты:
  • Точность подсчета важна, но в какой-то очень редкой форс-мажорной ситуации допустима потеря суммарно не более 200 визитов (это визиты всего за несколько минут в утреннее/дневное/вечернее время).
  • Нужна сортировка сущностей по числу визитов.
  • Обновление счетчика в базе в утренние/дневные/вечерние часы не реже одного раза в 30 минут. Это нужно для актуальности сортировок и адекватного отображения числа визитов в личном кабинете.


Сначала попробовали реализовать «в лоб». Мы создали в таблице сущности поле views_count (аналогично в таблице автосалона) и обновляли его при каждом просмотре страницы объявления (делали UPDATE
Всем удачи с подсчетами. Не изобретайте свои велосипеды без реальной необходимости.
Tags:
Hubs:
Total votes 38: ↑28 and ↓10 +18
Views 25K
Comments Comments 9

Information

Founded
Location
Россия
Website
vk.com
Employees
5,001–10,000 employees
Registered
Representative
Миша Буданов