6

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

浏览量示例

您可以在上面确切地看到我想要实现的目标,而 DeviantArt 在获得数百万点击时大规模地做到了这一点。

我在 PHP 和 MySQL 上使用 CodeIgniter

4

3 回答 3

6

通常,您在这些情况下所做的是拥有一个日志记录表,每个视图有 1 条记录。您以特定的时间间隔(每天)运行一次 cron,以将日志记录数据汇总到另一个汇总表中。在最基本的级别上,您将在汇总表中每天有 1 条记录以及总查看次数。由于历史数据永远不会改变,因此您无需进行更新。这为您每年最多为每个项目提供 365 条记录。记录不多,所以扩展性很好。

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

然后,您可以从汇总表中选择以获取每日计数,如果要显示当前天数,您可以从日志表中选择。

如果你想保持你的日志表很小,当你的 cron 运行时,你可以重命名日志表并创建一个新的空表。然后处理重命名的日志记录表。

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

如果您真的需要扩展,您可以使用复制技巧以极快的速度记录视图。您使用 BLACK HOLE 表类型来记录数据,它会复制到另一个服务器,其中该表是 MyISAM 或 InnoDB。

于 2012-12-01T14:53:26.820 回答
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”。

有关更多信息,请参阅本文

于 2012-12-01T14:36:33.290 回答
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

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

我希望这有帮助。


要为简单的每日计数器修改它,请添加一个名为“views”的额外列,它只是一个整数。然后在页面上检查数据库中今天是否有当前页面的行。如果是这样,则获取当前视图值并将其递增并转售给数据库。

对于总视图计数,我可能会创建另一个具有相同列但不包含日期时间列的表。然后在您的页面上,您也增加新表中当前页面的视图值。

这将很快减轻。权衡是细节的损失。所以,这里是第三个选项的 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.
于 2012-12-01T14:02:55.627 回答