首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储每日页面浏览量和总计数的最有效方式

问存储每日页面浏览量和总计数的最有效方式
EN

Stack Overflow用户
提问于 2012-12-01 21:24:53
回答 3查看 9.2K关注 0票数 6

有很多关于在数据库中存储文章或视频的页面浏览量的讨论,但我似乎找不到任何关于存储每日页面浏览量的信息。例如,DeviantArt在一个小图表中显示了过去15天左右的页面浏览量,以及配置文件的总页面浏览量。

​

​

你可以在上面看到我正在努力实现的目标,DeviantArt在巨大的规模上做到了这一点,因为他们获得了数百万的点击量。

我在PHP和MySQL上使用CodeIgniter

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-01 22:36:33

您可以为每一天设置一行,然后在查看时递增计数。

代码语言:javascript
复制
INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1;

和一个PHP脚本。

代码语言:javascript
复制
mysql_query("INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1;");

这使用了一个名为'views‘的表,以及两行'day’和'views‘。

有关详细信息,请参阅this article。

票数 5
EN

Stack Overflow用户

发布于 2012-12-01 22:53:27

通常,在这些情况下,您要做的是为每个视图创建一个包含1条记录的记录表。您让cron以特定的时间间隔(每天)运行,将日志记录数据汇总到另一个汇总表中。在最基本的级别,您每天在汇总表中有1条记录,其中包含总的视图计数。因为历史数据永远不会改变,所以您不需要进行更新。这样一来,每个项目每年最多可以有365条记录。记录不是很多,所以它的伸缩性很好。

这比每天只有一条记录并更新计数更具伸缩性。如果您尝试多次更新同一记录,则可能会遇到争用/锁定问题。通过执行INSERT DELAYED并使用MyISAM表,您的日志记录表可以很好地扩展。

然后,您可以从汇总表中进行选择以获得每日计数,如果您想要显示当前天数,则可以从记录表中进行选择。

如果您希望在cron运行时保持日志记录表较小,则可以重命名日志记录表并创建一个新的空表。然后处理重命名的记录表。

代码语言:javascript
复制
RENAME TABLE logging TO logging_old;CREATE TABLE logging LIKE logging_old;

如果您确实需要扩展,您可以使用复制技巧来以极快的速度记录视图。您使用黑洞表类型来记录数据,它会复制到表为MyISAM或InnoDB的另一台服务器上。

票数 5
EN

Stack Overflow用户

发布于 2012-12-01 22:02:56

我不使用codeIgniter,但这是你可以直接用php实现的方法。

基本上,您可以使用会话来记录对站点的每次访问,并记录其页面请求,也可以简单地记录页面上的每次点击。第一个选项为您提供更多信息(有多少独特的点击量,有多少点击量来自返回的访问者,等等)但是需要更多的编程来设置,并且需要用户会话管理。因此,为了您的目的,我将解释选项2。

SQL:

代码语言:javascript
复制
Table 'pageViews'
Id  - Integer, auto Increment, primary key
page - varchar(150)
datetime - datetime

在您正在监控的页面上,您可以添加:

代码语言:javascript
复制
    $query2 = "INSERT INTO `pageViews` (page, datetime) VALUES ('".$_SERVER["SCRIPT_NAME"]."', ".date("Y-M-d H:I:s").")";
    $result2 = //insert DB connection etc. to apply update to DB

然后,您可以根据页面和日期时间戳从数据库中获取行,对结果进行计数并使用html5画布显示结果。或者,因为每个点击都有一个日期时间,你可以将其进一步细分为一天中的几个小时等等。

我希望这能帮到你。

要修改简单的每日计数器,请添加一个名为'views‘的额外列,该列只是一个整数。然后在页面上检查数据库中是否有对应于当前页面的行。如果是,则获取当前视图值并递增,然后转售给数据库。

对于总视图计数,我可能会使用相同的列创建另一个表,但不使用日期-时间列。然后,在您的页面上,您还可以在新表中增加当前页面的Views值。

这将是闪电的速度。权衡的是细节的丢失。因此,下面是第三个选项的MySQL和PHP:

MySQL:

代码语言:javascript
复制
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:

代码语言:javascript
复制
// 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("Y-M-d 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("Y-M-d 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("Y-M-d 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.
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13659868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档