有关于在数据库中存储文章或视频的页面视图的讨论,但我似乎无法找到有关存储每日页面视图的任何信息。例如,DeviantArt会向您显示过去15天左右的时间以及每个页面视图中的每个页面视图的数量,以及配置文件的总页面视图。
你可以看到我正在努力实现的目标,DeviantArt大规模地实现它,因为它们获得了数百万次点击。
我在PHP和MySQL上使用CodeIgniter
答案 0 :(得分:5)
每天可以有一行,然后在查看时增加计数。
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;");
这使用一个名为'views'的表和2行'day'和'views'。
有关详细信息,请参阅this article。
答案 1 :(得分:4)
我不使用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("Y-M-d H:I:s").")";
$result2 = //insert DB connection etc. to apply update to DB
然后,您可以根据页面和日期时间戳从db中获取行,计算结果并使用html5 canvas显示它。或者,因为每次点击都有一个日期时间,你可以将其分解为一天中的几个小时等。
我希望这会有所帮助。
要为简单的每日计数器修改此项,请添加一个名为“views”的额外列,它只是一个整数。然后在页面上检查以查看db中当前页面是否存在当前行的行。如果是,则获取当前视图值并将其递增并转售到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("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.
答案 2 :(得分:4)
通常,在这些情况下您所做的是拥有一个记录表,每个视图有1条记录。您以一定的时间间隔(每天)运行一次cron,以将日志记录数据汇总到另一个汇总表中。在最基本的级别,您将在摘要表中每天有1条记录,其中包含总视图数。由于历史数据永远不会发生变化,因此您无需进行更新。这样每年每件商品最多可获得365条记录。不是很多记录,所以它可以很好地扩展。
这比每天记录一次并更新计数要好。如果您尝试多次更新同一记录,则可能会遇到争用/锁定问题。通过执行INSERT DELAYED并使用MyISAM表,您的日志记录表可以很好地扩展。
然后,您可以从摘要表中选择以获取每日计数,如果要显示当前天数,则可以从记录表中进行选择。
如果要保持日志记录表较小,当cron运行时,可以重命名日志记录表并创建一个新的空表。然后处理重命名的日志记录表。
RENAME TABLE logging TO logging_old;CREATE TABLE logging LIKE logging_old;
如果您确实需要扩展,可以使用复制技巧非常快速地记录视图。您使用BLACK HOLE表类型来记录数据,该表复制到表为MyISAM或InnoDB的另一台服务器。