2013-05-29 5 views
1

У меня есть таблица article со многими статьями. Я хочу отслеживать количество зрителей для каждой статьи. Вот моя идея, как я планирую это сделать.Расчет просмотров страниц в php/MySQL

Я таблицу viewers со строками: id, ip, date, article_id.

article_id является FOREIGN FIELD со ссылкой на статью id. Итак, когда пользователь открывает статью, его/ее IP-адрес хранится в таблице.

Это достойный подход? Это для личного сайта, а не для очень большого сайта.

EDIT: Я хочу напечатать номер просмотра на каждой странице статьи.

ответ

0

В этом дизайне существует одна проблема, если один и тот же пользователь открывает ее снова и снова, либо вы должны поставить чек перед вставкой записи, либо вставить один и тот же ip-адрес несколько раз, но с другой отметкой времени.

Большинство популярных сайтов считают один IP-адрес одним видом, даже если этот клиент или пользователь открывают эту статью несколько раз.

Я могу придумать решение.

  1. ваш подход с одной проверкой. если тот же клиент открыл его снова, не вставляйте его. или группу по идентификатору, когда вы извлекаете счетчик.
+0

Определение уникальных посетителей по их IP-адрес обычно считается плохой ход ... –

+0

@ av1987: Да, я должен сначала проверить, является ли IP уже там или нет. – xan

0

Это зависит от того, что вы хотите сохранить в своей базе данных. Если вы хотите точно знать, сколько уникальных пользователей посетило эту конкретную статью (включая дату и ip), это разумный способ сделать это. Но если вам нужно только число, которое вы можете показать, вы можете изменить таблицу статей и включить новый столбец с помощью visit_counter и сохранить cookie, чтобы предотвратить увеличение счетчика на одном и том же пользователе.

+0

Для более подробного счетчика просто используйте Google Analytics. – J33nn

0

попробовать что-то вроде этого

// insert 
$query = mysqli_query("REPLACE INTO viewers (ip) VALUES ('" . ip2long($_SERVER['REMOTE_ADDR']) . "')"); 

// retrieve 
list($pageviews) = mysqli_fetch_row(mysqli_query("SELECT COUNT(ip) FROM viewers")); 

echo $pageviews; 

Read: REPLACE INTO

1

Это зависит от того, как часто вам нужно отобразить количество просмотра. Ваш общий запрос будет:

select count(*) from viewers 
where article_id='10' 

Со временем ваш viewers таблица будет расти. Скажем, у него есть миллион записей через год или два. Теперь, если вы показываете количество зрителей на каждой странице статьи или показываете статьи с большим количеством зрителей, она начнет влиять на производительность, даже если индексируется внешний ключ. Однако это произойдет после того, как вы добавите сотни статей, каждый из которых будет иметь тысячи зрителей.

Лучшее оптимизированное решение может заключаться в том, чтобы сохранить число зрителей в таблице статей и использовать их для отображения результатов. Таблица «Существующие зрители» также необходима для обеспечения дублирования записи (один и тот же пользователь, читающий статью десять раз, должен быть помечен как одиночная запись, а не десять).

1

Используйте такой инструмент, как Google Analytics. Это сделает работу намного более развитой, и вы заработаете в течение нескольких минут, и об уникальных посетителях больше, чем о IP-адресах!

Если вы хотите иметь решение по положению, посмотрите на PIWIK, который представляет собой PHP-фреймворк именно для этого puprose.

+0

GA - отличное решение. Они также проверяют URL-адрес ссылки, чтобы определить, откуда пришел пользователь, и это предотвратит ложные удары пользователя, просто нажимая обновление. – StaticVoid

+0

@StaticVoid: Я использую инструменты GA. Но я не знаю, как печатать количество пользователей на странице через GA. – xan

+0

@Axel Amthor: Я хочу напечатать количество просмотров для каждой статьи. Будет ли это делать? – xan

0

Да, это хорошо aproach, если вы создаете какой-то кеш для отображения количества просмотров каждой статьи. Невозможно подсчитывать просмотры каждый раз, когда пользователь открывает веб-сайт.

  1. Вы можете сделать это на SQL Server. Есть что-то вроде materialized view. (https://code.google.com/p/flexviews/)

    select article_id, count(*) as views from viewers group by article_id 
    
  2. Или вы можете кэшировать его в файлах и обновления каждый раз, когда X.

  3. Чтобы сохранить пользователей, просмотревшие статью, я предлагаю использовать AJAX. Когда пользователь открывает веб-сайт, другой «поток» будет вызывать веб-сайт, чтобы добавить его в качестве зрителя. Даже если ваш бит медленный, он не замедлит загрузку веб-сайта, и пауки паутины не будут учитываться.

Смежные вопросы