Как реализовать функцию статистики просмотра страницы за некий период?

Не знаю как правильно подойти к реализации функции, с помощью которой я смогу выдавать пользователям о количестве просмотрев некой страницы. Важно, что бы это была статистика за день/месяц/год/всё время. Конкретно как реализовать количество просмотров за всё время не составит труда, но как реализовать это за некий период? Я ведь не могу хранить какой-то словарь с датами и количеством просмотрев... А если нужно будет реализовать за несколько лет? :

Дополнительно:

Важно, что бы это была статистика за день/месяц/год/всё время.

Первое что нужно - определитесь с минимальной статистической единицей, если это день - значит храните сумму за день, табличка соответственно будет что-то типа:
id, page_id, date, views;
Соответственно если нужен меньший таймфрейм - дата будет уже дататайм. Далее простой джоин, груп с аггрегацией и sum()

  • Спасибо, уже часть реализовал. Остался вопрос, как правильно будет прикрутить, что бы оно каждый день отдельный закидывало в БД?

    Имею ввиду, я подумал, что лучшим вариантом будет хранить тип [id, views, date, pageId]. При просмотре страницы брать рекорд по id соответствующей страницы + текущая data и делать инкремент количества просмотров. Так мы сможем изолировать состояние статистических данных на уровне БД и не будем выносить это на уровень приложения

    А далее я не знаю как его правильно реализовать.
    Я решил прикрутить BackgoundService, который каждый день ровно в 00:01 будет вносить в БД новые записи о всех продуктах по Id. Т.е., будут брать ВСЕ id ВСЕХ страниц и под каждую страницу создаваться новый рекорд в БД с указанием id этой страницы + текущая дата. Что-то типа Bulk запроса (Для PostgreSql, который я юзаю, такого нет, по этому там либо json/jsonb (под Dapper) , либо цикл)

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

  • Остался вопрос, как правильно будет прикрутить, что бы оно каждый день отдельный закидывало в БД?

    А? Просто при каждом удачном выборе для показа делаете INSERT INTO stat (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; и делаете уникальным ключом дату+айди.

  • ThunderCat, насколько я понял, это что-то типа CREATE IF NOT EXISTS?
  • Nik Faraday, да, только update if exists
  • Мне кажется, даже это слишком сложно. Никаких сумм никуда не закидывается, просто при каждом вызове страницы в конце добавляется вставка этого вызова в БД.
    Записывать можно URL, параметры, инфо о браузере, время и т.п. Об ID записи вообще не надо думать, просто таблица с автогенерацией ID. Никакие ON DUPLICATE тогда не нужны.
    Для статистики - COUNT, WHERE, ORDER BY и т.д. (я про MySQL, но, полагаю, и в POSTGRES есть такое)
    И ради бога, никаких библиотек, это чрезвычайно просто в реализации.
  • Natalia Baženova, там больше проблема в том, что статистика должна считаться за каждый день для каждой страницы. При просмотре статистики можно выбрать период просмотра выборки. И тут уже как-то костылями крыть это всё. А записывать в БД можно всё что угодно, хоть даже IP адреса юзеров, только по какой дате их записать? Какой страницы?

    И да, вы тут забываете ещё о защите от Ctrl + R или подобных действий

  • Nik Faraday, В таблице делаете поле типе DATETIME, по умолчанию CURRENT TIMESTAMP. Таким образом, оно будет заполняться автоматически.
    При выборке за день задаете WHERE DATE(имя_поля)=требуемая_дата. Вот и статистика за день.
    Никаких костылей здесь нет.
    Кстати, IP имеет смысл записывать, хоть оно и не идентифицирует юзера, но несет много информации.
    Если кто-то нечаянно нажмет CTRL-R, статистике это абсолютно не повредит.
    Если же кто-то будет усердно нажимать эту комбинацию в течение часа, он явно заслужил наше дополнительное внимание. Такого юзера легко выделить и убрать его заходы из таблицы.
  • Natalia Baženova, спасибо. Можете вынести это всё в отдельный ответ, я помечу решением. Мне нравится ход ваших мыслей)
  • Nik Faraday, добавила ответ

При каждом вызове страницы в конце добавляется вставка этого вызова в БД.
Записывать можно URL, параметры, инфо о браузере, время и т.п. Об ID записи вообще не надо думать, просто таблица с автогенерацией ID. Никакие ON DUPLICATE тогда не нужны.
Для статистики - COUNT, WHERE, ORDER BY и т.д. (я про MySQL, но, полагаю, и в POSTGRES есть такое)
В таблице делаете поле типе DATETIME, по умолчанию CURRENT TIMESTAMP. Таким образом, оно будет заполняться автоматически.
При выборке за день задаете WHERE DATE(имя_поля)=требуемая_дата. Вот и статистика
за день.
Кстати, IP имеет смысл записывать, хоть оно и не идентифицирует юзера, но несет много информации.
Если кто-то нечаянно нажмет CTRL-R, статистике это абсолютно не повредит.
Если же кто-то будет усердно нажимать эту комбинацию в течение часа, он явно заслужил наше дополнительное внимание. Такого юзера легко выделить и убрать его заходы из таблицы.

Ответы:

Я ведь не могу хранить какой-то словарь с датами и количеством просмотрев...

Почему нет? Для этого давно существуют базы данных.
(только не "словарь", а "данные")

  • Хорошо, как вы предлагаете это реализовать?
  • Nik Faraday, что значит как? Для начала научиться работать с БД.
  • Nik Faraday, привинтить или изобрести мониторинг

    у микрософта это называется Application Insights

  • Refguser, сударь, серьёзно? А я по вашему, где данные храню? В почтовом ящике, или под матрасом?
  • сергей кузьмин, ну, тут скорее нужен собственный велосипед
  • Nik Faraday, у дот нет есть сек
    https://docs.datalust.co/docs/an-overview-of-seq
    его и прикручивайте
    есть конечно прометеус и инфлюкс и элестик
    их и прикручивайте
    если помогло - я положу в ответы вы отметите решением
  • Nik Faraday, я без понятия где ты что хранишь. Но если бы знал по БД - не написал того, что я процитировал.

    Вон ThunderCat даже разжевал, хотя я и не уверен, что это стоило делать.

  • Refguser, так вопрос о реализации, а не о том, куда мне это закидывать. Если есть нормальный вариант реализации, я с радостью почитаю. А эти расскажи о существовании БД просто пустой диалог
  • Nik Faraday, человек, знающий о существовании воды не сомневается в существовании возможности плавания.
    Человек, знающий о существовании БД не сомневается в существовании возможности вести какую угодно статистику.
    Человек, хоть чуть-чуть умеющий работать с БД уже сможет хоть что-то накидать и спросить совета насчёт правильности и тп.

    Ты же хочешь хочешь что бы за тебя всё сделали. С этим на фриланс.

  • Refguser, причём тут работа с бд... Господи, что ты несёшь? При чём тут фриланс?

    Умник, почему ты находишься на форуме? Судя по твоим вопросам ты не знаешь что такое css? У вас вот вопрос по css. Вы что, не знаете о сущестовании фриланса? Как вы посмели вопрос то тут задать? Идите на фриланс, там вопросы задавай умник

Тут подходит какая-нибудь аналитическая СУБД. Например, ClickHouse практически для этого и создавался (Click Stream + Ware House).
Хранить можно следующим образом:
1. Есть общая таблица по посещениям/визитами с примерно такой структурой [page_id, visit_date] (больше и не надо)
2. Для хранения статистики создаешь материализованные представления для дня/недели/года

У них есть тестовые данные для плейграунда сбора аналитики по посещениям/хитам - https://clickhouse-docs.vercel.app/docs/en/getting...

  • Что-то под PostgreSql нужно. У меня оно на linux'е развернуто, по этому менять будет очень напряжно
  • Nik Faraday, тогда можно попробовать так:
    1. Таблица одна - [page_id, date, visits_count] - id страницы, дата (только дата без времени) посещения, кол-во посещений
    2. На каждый заход на страницы вызывается UPDATE SET visits_count += 1 WHERE date = today() AND page_id = id
    3. Для годовых/месячных/дневных делаешь материализованное представление

    P.S. - т.к. годовые/месячные/дневные больше не обновляются, то можно создать для них отдельную таблицу и хранить уже подсчитанные значения там. Обновлять скриптом по окончании периода.

  • Сергей Соловьев, вырезка из другого моего ответа:

    Остался вопрос, как правильно будет прикрутить, что бы оно каждый день отдельный закидывало в БД?

    Имею ввиду, я подумал, что лучшим вариантом будет хранить тип [id, views, date, pageId]. При просмотре страницы брать рекорд по id соответствующей страницы + текущая data и делать инкремент количества просмотров. Так мы сможем изолировать состояние статистических данных на уровне БД и не будем выносить это на уровень приложения

    А далее я не знаю как его правильно реализовать.
    Я решил прикрутить BackgoundService, который каждый день ровно в 00:01 будет вносить в БД новые записи о всех продуктах по Id. Т.е., будут брать ВСЕ id ВСЕХ страниц и под каждую страницу создаваться новый рекорд в БД с указанием id этой страницы + текущая дата. Что-то типа Bulk запроса (Для PostgreSql, который я юзаю, такого нет, по этому там либо json/jsonb (под Dapper) , либо цикл)

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

 

Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.

 

    • Как реализовать функцию статистики просмотра страницы за некий период?Есть ответ
    • 07.04.2024
    Ответить

    Для реализации функции статистики просмотра страницы за определенный период времени, вам понадобится база данных, в которой вы будете хранить информацию о просмотрах страниц. В данном примере мы будем использовать язык программирования PHP и MySQL для создания такой функциональности.

    1. Создайте таблицу в вашей базе данных, где будет храниться информация о просмотрах страниц. Например, вы можете создать таблицу с полями id, page_id, view_date.

    CREATE TABLE page_views (
        id INT AUTO_INCREMENT PRIMARY KEY,
        page_id INT,
        view_date DATETIME
    );

    2. После того как у вас есть таблица для хранения данных о просмотрах страниц, добавьте код PHP, который будет записывать информацию о просмотре страницы в базу данных.

    function log_page_view($page_id) {
        $db = new mysqli('localhost', 'username', 'password', 'database_name');
     
        $page_id = $db->real_escape_string($page_id);
        $view_date = date('Y-m-d H:i:s');
     
        $sql = "INSERT INTO page_views (page_id, view_date) VALUES ('$page_id', '$view_date')";
        $db->query($sql);
    }

    3. Теперь, чтобы получить статистику просмотров страницы за определенный период времени, вы можете использовать следующий код:

    function get_page_views($page_id, $start_date, $end_date) {
        $db = new mysqli('localhost', 'username', 'password', 'database_name');
     
        $page_id = $db->real_escape_string($page_id);
        $start_date = $db->real_escape_string($start_date);
        $end_date = $db->real_escape_string($end_date);
     
        $sql = "SELECT COUNT(*) as total_views FROM page_views WHERE page_id = '$page_id' AND view_date BETWEEN '$start_date' AND '$end_date'";
        $result = $db->query($sql);
        $row = $result->fetch_assoc();
     
        return $row['total_views'];
    }
     
    // Пример использования
    $page_id = 1;
    $start_date = '2022-01-01 00:00:00';
    $end_date = '2022-01-31 23:59:59';
     
    $total_views = get_page_views($page_id, $start_date, $end_date);
    echo "Total views for page with ID $page_id from $start_date to $end_date: $total_views";

    Таким образом, вы можете легко реализовать функцию статистики просмотра страницы за определенный период времени, используя PHP и MySQL.

Оставить комментарий