记录每个页面/对象访问的最佳实践方法是什么
以我的个人资料为例,或者这个网站上任何问题的浏览次数,网站上记录每个页面或对象访问次数的过程,我认为大概包括以下几个方面:
- 对注册用户进行一次性计数(这需要在数据库中反映出用户访问了哪些页面或对象)。这也不包括未注册的用户。
- IP地址:记录每个IP在每个页面或对象的访问情况;这可能会有点麻烦,因为可能有两个不同的人在查看同一个网站;或者你确实想追踪重复访问的用户。
- Cookie:这可能导致使用多台电脑的人被计算两次。
- 其他方法在这里……
问题是,计算用户请求的过程和最佳实践是什么?
编辑
我已经把计算机语言添加到标签列表中,因为我对此感兴趣。欢迎随意添加任何可以完成这个任务的库、模块或扩展。
这个问题可以重新表述为:
- 当用户访问一个页面时,如何测量访问次数?这个问题并不是想和谷歌分析做的事情相似,而是类似于当你点击一个StackOverflow的问题或个人资料时,看到的浏览次数。
6 个回答
使用数据库来记录独特的IP地址(如果这个IP在数据库里不存在,就创建一个;如果已经存在,就继续按计划进行)。然后查询数据库,看看这些IP的数量。把IP和网址作为索引,这样就可以记录每个页面的访问量。通过这种方式,你就不用担心追踪注册用户了,他们会被算入独特IP的总数。至于多个用户使用同一个IP,这里没什么好办法,除非要求用户注册账户,然后类似地统计用户到页面的访问量。
关于访问计数器的最佳做法,主要取决于你预计网站会有多少流量。正如wybiral所建议的,你可以在每次请求后把数据写入数据库。这可能包括用户的IP地址,如果你想统计独立访客的话;或者你也可以简单地为每个页面或每个(页面,用户)组合增加一个总数。
不过,这样做的缺点是每次请求都需要写入数据库,即使你只是想提供一个静态页面。理想情况下,一个可扩展的网络应用应该尽量从内存缓存中提供服务,尽量避免数据库或磁盘的读写操作。
所以,理想的设置是先在内存中记录服务器的活动,然后偶尔(比如每15分钟)把这些事件写入数据库。你可以想象一下,把成千上万的请求排队,然后通过一次数据库写入来存储它们。
有一个教程详细讲解了如何使用Python中的Celery和Carrot来实现这个功能:http://packages.python.org/celery/tutorials/clickcounter.html。这个教程还包括如何使用Django模型设置数据库表,以及在有人访问页面时调用什么代码的示例。
无论你选择实现什么,这个教程对你都一定会有帮助,尽管如果你不预计每小时会有成千上万的访问,这种架构可能会显得有些复杂。
“正确”的答案其实是根据具体情况而定的,主要看你最想要什么样的数据,以及你能否获取和处理这些数据。举个例子:
服务器端
原始网页服务器日志
所有的网页服务器都有记录请求的功能。不过,这些日志需要经过很多处理才能得到有用的数据。而且在你的例子中,它们不会记录应用程序特定的细节,比如请求是否和注册用户有关。
所以,这个选项不适合你想要的内容。
基于文件的应用日志
应用程序的开发者可以在应用中添加自定义代码,把你最关心的信息记录到日志文件里。这和网页服务器日志类似,但它可以更了解应用的情况,记录像是发起请求的用户等信息。
开发者可能还需要编写脚本,从这些日志中提取你最关心的数据。这个选项适合流量大的网站,前提是有足够的磁盘空间,并且系统管理员知道如何管理日志,确保在出现问题之前把日志进行轮换和清理。
基于数据库的应用日志
应用程序的开发者可以写自定义代码,把每个请求记录到数据库中。这样就可以比较容易地生成报告,数据也能立即访问。不过,这种方法在每次请求时会增加系统负担,所以更适合流量较少的网站,或者数据非常重要的场景。
客户端
Javascript回传
这是在上述选项基础上的一种考虑。谷歌分析就是这样做的。
每个页面都包含一些Javascript代码,告诉客户端向网页服务器报告这个页面被查看了。数据可能会被记录到数据库中,或者写入文件。
这种方法在客户端和服务器之间由于缓存或代理导致数据丢失的情况下,能显著提高准确性。
Cookies(小甜饼)
每次收到没有携带cookie的请求时,你就可以假设这个用户是新来的,并把这次访问记录为“匿名”,在他们登录后再返回一个唯一的cookie。这个方法的准确性取决于你的应用。有些应用不容易缓存,所以准确性会很高;而有些高流量的应用则会鼓励缓存,这样就会降低准确性。显然,直到用户在切换浏览器或位置时重新认证,这个方法才有用。
你最关心的是什么?
接下来就是你最关心哪些统计数据的问题。例如,在某些情况下,你可能想知道:
- 一个页面被查看了多少次,
- 一个页面被已知用户查看了多少次,
- 有多少已知用户查看了特定页面。
因此,你通常想把这些数据分解成不同的时间段,以便观察趋势。
- 我们是否从随机用户那里获得了更多的访问?
- 还是从注册用户那里获得了更多的访问?
- 或者说,几乎所有会查看这个页面的人都已经看过了?
回到你的问题:关于“用户访问页面时的印象数量”的最佳实践是什么?
这取决于你的应用。
我猜最好的方法是使用一个数据库支持的应用,记录对你应用最重要的数据,并使用cookies来追踪用户的会话。