Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 存储每日页面浏览量和总计数的最有效方法_Php_Mysql_Performance_Pageviews_Storing Data - Fatal编程技术网

Php 存储每日页面浏览量和总计数的最有效方法

Php 存储每日页面浏览量和总计数的最有效方法,php,mysql,performance,pageviews,storing-data,Php,Mysql,Performance,Pageviews,Storing Data,关于在数据库中存储文章或视频的页面视图有很多讨论,但我似乎找不到任何关于存储每日页面视图的信息。例如,DeviantArt在一个小图中显示了过去15天左右的时间以及每个人的页面浏览量,以及概要文件的总页面浏览量 你可以在上面看到我正试图实现的目标,DeviantArt在获得数百万点击率的同时,以巨大的规模实现了这一目标 我在PHP和MySQL上使用CodeIgniter我没有使用CodeIgniter,但下面介绍如何在纯PHP中实现这一点 基本上,您可以使用会话记录对站点的每次访问并记录他们的

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

你可以在上面看到我正试图实现的目标,DeviantArt在获得数百万点击率的同时,以巨大的规模实现了这一目标


我在PHP和MySQL上使用CodeIgniter

我没有使用CodeIgniter,但下面介绍如何在纯PHP中实现这一点

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

SQL:

在您监视的页面上,您将添加:

    $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画布显示。或者,因为每次点击都有一个日期时间,你们可以把它进一步细分为一天中的几个小时等等

我希望这有帮助


要对简单的每日计数器进行修改,请添加一个名为“视图”的额外列,该列只是一个整数。然后在页面上进行检查,查看数据库中是否有当前页面的当前行。如果是,则获取“当前视图”值并将其递增,然后重新出售给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:

//今天在数据库中搜索dailyViews中此页面的条目
$query=“从`dailyViews`中选择视图,其中`page`=”。$\u服务器[“SCRIPT\u NAME”]”和`datetime`=”。日期(“Y-M-d H:I:s”);
$result=//插入数据库连接等以执行查询
if(mysqli_num_rows($result)==1){
$resultArray=mysqli\u fetch\u数组($result,mysqli\u ASSOC);
$views=$resultArray['views']+1;
$query2=“UPDATE`dailyViews`SET`views`=”$views。“其中`page`=”$\u服务器[“SCRIPT\u NAME”]”和`datetime`=”。日期(“Y-M-d H:I:s”);
$result2=//插入数据库连接等以将更新应用于数据库

}否则,如果(mysqli_num_rows($result)您可以每天有一行,然后在查看时增加计数

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;");
这使用了一个名为“视图”的表和两行“日”和“视图”


有关更多信息,请参阅。

通常,在这些情况下,您要做的是创建一个日志记录表,每个视图有一条记录。您有一个cron以一定的间隔(每天)运行将日志记录数据汇总到另一个汇总表中。在最基本的级别上,汇总表中每天有1条记录和总视图计数。由于历史数据从不更改,因此不需要进行更新。这样,每年每个项目最多可以有365条记录。记录不多,因此可以很好地扩展

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

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

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

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

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

那么你是说每个页面视图都有一个新行?在一个每天有数百万点击量的大型站点上,这不会变得很慢吗s取决于站点,但如果不是每天数百万次点击,则通常不会。行的字节数非常小,因此响应速度非常快。我建议的方法很容易扩展,以获取有关页面浏览量的更多信息(例如将其分解为每小时浏览次数)。如果您愿意,我可以添加一个简单的每日计数器选项。我已经更新了我的答案。出于好奇,它是什么网站?我很惊讶您每天都会有数百万次点击。这主要是出于兴趣,我现在不需要使用这样的脚本,但我已经开始在一些更大的网站上工作,所以将来可能需要它:)
mysql_query("INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1;");
RENAME TABLE logging TO logging_old;CREATE TABLE logging LIKE logging_old;