Наиболее эффективный способ хранения ежедневных просмотров страниц, а также общий счет

Там есть дискуссия о сохранении просмотров страниц для статьи или видео в базе данных, но я не могу найти никакой информации о хранении ежедневных просмотров страниц. Например, DeviantArt показывает вам последние 15 или около того дней, а также количество просмотров каждой страницы на маленьком графике, а также общее представление страницы для профиля.

Пример просмотра страниц

Вы можете видеть выше точно, чего я пытаюсь достичь, и DeviantArt делает это в огромных масштабах, так как они получают миллионы хитов.

Я использую CodeIgniter для PHP и MySQL

Solutions Collecting From Web of "Наиболее эффективный способ хранения ежедневных просмотров страниц, а также общий счет"

У вас может быть строка для каждого дня, а затем увеличивать счетчик при его просмотре.

INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1; 

И PHP-скрипт …

 mysql_query("INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1;"); 

Это использует таблицу с названием «виды» и 2 строки «день» и «виды».

См. Эту статью для получения дополнительной информации.

Обычно, что вы делаете в этих случаях, есть таблица журналов с 1 записью на просмотр. Вы выполняете cron с определенными интервалами (ежедневно), чтобы суммировать данные регистрации в другой сводной таблице. На самом базовом уровне у вас будет 1 запись в день в сводной таблице с общим количеством просмотров. Поскольку исторические данные никогда не изменяются, вам не нужно делать обновления. Это дает вам не более 365 записей за каждый год. Не так много записей, поэтому он хорошо масштабируется.

Это масштабируется лучше, чем наличие одной записи за каждый день и обновление счета. Вы можете столкнуться с проблемами конкуренции / блокировки, если вы пытаетесь обновить одну и ту же запись несколько раз. Выполняя INSERT DELAYED и используя таблицу MyISAM, ваша таблица регистрации может масштабироваться очень хорошо.

Затем вы можете выбрать из сводной таблицы, чтобы получать ежедневные подсчеты, и вы можете выбрать из таблицы ведения журнала, если вы хотите отобразить счет текущих дней.

Если вы хотите, чтобы таблица регистрации была маленькой, при запуске cron вы можете переименовать таблицу ведения журнала и создать новую, пустую. Затем обработайте переименованную таблицу протоколирования.

 RENAME TABLE logging TO logging_old;CREATE TABLE logging LIKE logging_old; 

Если вам действительно нужно масштабировать, вы можете использовать трюк репликации для просмотра журналов очень быстро. Вы используете тип таблицы BLACK HOLE для регистрации данных, который реплицируется на другой сервер, на котором находится таблица MyISAM или InnoDB.

Я не использую codeIgniter, но вот как вы можете это сделать в прямом php.

В принципе, вы можете использовать сеансы для записи каждого посещения вашего сайта и записи их запросов на страницы, или вы можете просто записать каждый хит на странице. Первый вариант дает вам больше информации (количество уникальных хитов, количество обращений от возвращающихся посетителей и т. Д.), Но требует больше программирования для настройки и требует управления сеансом пользователя. Итак, для ваших целей я объясню вариант 2.

SQL:

 Table 'pageViews' Id - Integer, auto Increment, primary key page - varchar(150) datetime - datetime 

На странице, которую вы контролируете, вы добавили:

  $query2 = "INSERT INTO `pageViews` (page, datetime) VALUES ('".$_SERVER["SCRIPT_NAME"]."', ".date("YMd H:I:s").")"; $result2 = //insert DB connection etc. to apply update to DB 

Затем вы можете извлекать строки из db на основе страницы и штампа даты и времени, подсчитывать результаты и отображать их с помощью html5 canvas. Или, потому что каждый удар имеет дату и время, вы можете разбить его дальше на часы дня и т. Д.

Надеюсь, это поможет.


Чтобы изменить это для простых ежедневных счетчиков, добавьте дополнительный столбец с именем «views», который является просто целым числом. Затем на странице поставьте чек, чтобы увидеть, есть ли строка для текущей страницы на сегодняшний день в db. Если это так, то получите текущее представление и увеличьте его и перепродайте в БД.

Для общего количества просмотров я бы, вероятно, создал другую таблицу с одинаковыми столбцами, но не с столбцом даты и времени. Затем на вашей странице вы увеличиваете значение просмотров для текущей страницы в новой таблице.

Это будет быстро освещаться. Компромисс – это потеря деталей. Итак, вот MySQL и PHP для этого третьего варианта:

MySQL:

 Table 'dailyViews' Id - Integer, auto Increment, primary key views - integer page - varchar(150) datetime - datetime Table 'totalViews' Id - Integer, auto Increment, primary key views - integer page - varchar(150) 

PHP:

 // Search the DB for an entry today for this page in dailyViews $query = "SELECT views FROM `dailyViews` WHERE `page`='".$_SERVER["SCRIPT_NAME"]."' AND `datetime`=".date("YMd H:I:s").""; $result = //insert your db connection etc to execute the query if (mysqli_num_rows($result)==1) { $resultArray = mysqli_fetch_array($result, MYSQLI_ASSOC); $views = $resultArray['views']+1; $query2 = "UPDATE `dailyViews` SET `views`=".$views." WHERE `page`='".$_SERVER["SCRIPT_NAME"]."' AND `datetime`=".date("YMd H:I:s").""; $result2 = //insert DB connection etc. to apply update to DB } else if (mysqli_num_rows($result)<1) { $query2 = "INSERT INTO `dailyViews` (views, page, datetime) VALUES (1, '".$_SERVER["SCRIPT_NAME"]."', ".date("YMd H:I:s").")"; $result2 = //insert DB connection etc. to apply update to DB } else { // there is more than one entry for this page and date in the DB. An error has ccurred } // Then just get the total views for this page and increase it by 1.