我有一张桌子article
,上面有很多文章。我想跟踪每篇文章的查看人数。这是我的想法,我打算如何去做。
我有一个viewers
行表:id
, ip
, date
, article_id
.
article_id
是对文章的FOREIGN FIELD
引用id
。因此,当用户打开一篇文章时,他/她的 IP 地址存储在表中。
这是一个体面的方法吗?它适用于个人网站,而不是非常大的网站。
编辑:我想在每个文章页面上打印查看次数。
这取决于您需要显示查看器数量的频率。您的一般查询将是:
select count(*) from viewers
where article_id='10'
随着时间的推移,你的viewers
桌子会变大。假设它在一两年后拥有数百万条记录。现在,如果您在每个文章页面上显示查看者数量或显示大多数查看者的文章,即使外键被索引,它也会开始影响性能。但是,这将在您添加数百篇文章且每篇文章有数千名观众之后发生。
更好的优化解决方案可能是保留文章表中的查看者数量并使用它来显示结果。现有的 Viewers 表也是必要的,以确保没有重复条目(同一用户阅读一篇文章十次必须标记为单个条目而不是十次)。
使用像谷歌分析这样的工具。这将使这项工作更加详尽,并且您可以在几分钟内启动并运行,除了 IP 地址之外,还有更多关于唯一访问者的信息!
如果您想拥有一个本地解决方案,请查看PIWIK,它正是这个 puprose 的 PHP 框架。
是的,如果您创建某种缓存来显示每篇文章的浏览量,这是一个很好的方法。每次用户打开网站时计算浏览量并不是最佳选择。
您可以在 SQL Server 中执行此操作。有类似的东西materialized view
。(https://code.google.com/p/flexviews/)
select article_id, count(*) as views from viewers group by article_id
或者您可以将其缓存在文件中并每 X 次刷新一次。
为了存储查看过文章的用户,我建议使用 AJAX。当用户打开网站时,另一个“线程”将调用网站将其添加为查看器。即使您的数据库很慢,它也不会减慢网站加载速度,网络蜘蛛也不会被计算在内。
在这种设计中,如果同一个用户一次又一次地打开它,那么您必须在插入条目之前进行检查,或者您多次插入相同的 IP 地址但不同的时间戳。
即使该客户或用户多次打开该文章,大多数流行网站仍将一个 IP 地址视为一种视图。
我能想到解决办法。
这取决于您要在数据库中存储的内容。如果你想知道有多少独特的用户访问了这篇特定的文章(包括日期和 IP),这是一个合理的方法。但是,如果您只需要一个数字来显示您可以更改文章表并包含带有 visit_counter 的新列并存储 cookie 以防止同一用户的计数器增加。
尝试这样的事情
// 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;
阅读:替换成