记录每个页面/对象访问的最佳实践方法是什么?

9
我的个人资料为例,或者这个网站上任何一个问题的浏览量,如何记录网站上每个页面或对象的访问次数,我认为这可能包括以下步骤:
  • 仅计算已注册用户一次(必须反映在数据库中,用户访问了哪些页面/对象)。这也不包括未注册用户。
  • IP:记录每个IP对每个页面/对象的访问;这可能会有问题,因为您可能有两个不同的人检查同一个网站;或者您确实想跟踪重复访问者。
  • Cookie:这可能会导致使用多台计算机的人被计算两次
  • 其他方法在此处....

问题是,计算用户请求的过程和最佳实践是什么?

编辑

我已将计算机语言添加到标签列表中,因为它们对我很有兴趣。请随意包括任何可实现该任务的库、模块和/或扩展。

问题可以重新表述为:

  • 当用户访问页面时,如何测量印象次数?这个问题不是要类似于Google Analytics那样的东西,而是类似于当你点击stackoverflow的问题或者个人资料时,看到的浏览次数。
6个回答

19

根据情况,“正确”的答案有所不同; 主要取决于最受欢迎的统计数据和收集和处理它们的资源可用性: 例如:

服务器端

原始Web服务器日志

所有Web服务器都具有某种记录请求的功能。但是,它们的问题在于需要大量处理才能获得有意义的数据,并且对于您的示例场景,它们不会记录应用程序特定的详细信息,例如请求是否与注册用户相关。

这个选项不能满足你的需求。

基于文件的应用程序日志

应用程序员可以为应用程序应用定制代码以将您最感兴趣的内容记录到日志文件中。这类似于Web服务器日志,但它可以对应用程序进行感知并记录诸如发出请求的成员之类的信息。

程序员还可能需要构建提取所需信息的脚本。此选项可能适用于高流量站点,具有大量磁盘空间和了解如何确保在发生问题之前从生产服务器中轮换和修剪日志的系统管理员。

基于数据库的应用程序日志

应用程序员可以为应用程序编写自定义代码,以在数据库中记录每个请求。这使得运行报告相对容易,并使数据立即可用。该解决方案每次请求时会产生更多系统开销,因此更适用于流量较少的站点或高度重视数据的情况。

客户端

Javascript 回发

这是以上选项的一种考虑因素。Google分析就是这样做的。

每个页面都包括一些JavaScript代码,告诉客户端向Web服务器报告页面已查看。数据可以记录在数据库中或写入文件中。

在客户端和服务器之间存在重缓存/代理的情况下,具有提高准确性的强大优势。

Cookies

每次接收到未携带 cookie 的请求时,您会认为它是新的并记录该访问作为 '匿名' 访问,然后在用户登录后返回一个唯一标识符的 cookie。这取决于您的应用程序,以确定其准确性。某些应用程序不适合缓存,因此准确度将相当高;而其他高流量的应用程序则鼓励缓存,这将降低准确性。显然,除非他们在切换浏览器/位置时重新进行身份验证,否则它没有太大用处。
对您最重要的问题是什么?那么问题就来了,哪些统计数据对您最重要。例如,在某些情况下,您可能想知道:
- 页面被查看的总次数 - 已知用户查看页面的次数 - 已知用户中有多少人查看了特定页面
然后,您通常需要按时间段进行分解以查看趋势。分别是:我们是否从随机访客那里获得更多的页面访问量?还是我们从注册用户那里获得更多的页面访问量?或者几乎所有可能查看该页面的人都已经看过了吗?
回到您的问题:关于“用户访问页面时印象数量”的最佳做法是什么?这取决于您的应用程序。我猜您最好使用基于数据库的应用程序来记录对您的应用程序最有趣的内容,并使用 cookie 跟踪会员的会话。

一个非常好的答案加1。在处理日志文件时(特别是那些可能会变得非常大的文件),考虑编写脚本以从一天、一周或一个月的日志中提取重要信息,以避免保留大量旧的日志文件。 - GWW
你忘记了使用像Redis这样的内存缓存来进行服务器端缓存。 - Paras

5
一个点击计数器的最佳实践取决于您预计网站接收到的流量。正如wybiral所建议的那样,您可以实现在每个请求后写入数据库的功能。如果您想要计算独特访问者,则可能包括IP地址,或者只需为每个页面或每个(页面,用户)对递增运行总数即可。
但是,即使您只想提供静态页面,这也需要每个请求进行一次数据库写入。理想情况下,可扩展的Web应用程序应尽可能从内存缓存中提供服务。应尽可能避免使用数据库或磁盘I/O。
因此,理想的设置是在内存中建立服务器活动的某些表示形式,然后偶尔(比如每15分钟)将这些事件写入数据库。您可以概括地排队数千个请求,然后通过单个数据库写入存储它们。
有一个教程描述了如何使用Celery和Carrot在Python中执行此操作:http://packages.python.org/celery/tutorials/clickcounter.html。它还包括一些示例,说明如何使用Django模型设置数据库表以及每当有人访问页面时调用哪些代码。
无论您选择实现什么,此教程肯定会对您有所帮助,尽管如果您预计每小时不会有数千次点击,则此架构级别可能过高。

1
使用数据库来记录唯一IP的记录(如果IP不存在于数据库中,则创建它,否则按计划继续),然后查询数据库以获取这些实体的数量。将其与IP和URL索引以存储单个页面的视图。您不必担心通过此方式跟踪注册用户,他们将被计入唯一IP计数中。至于来自一个IP的多个人,除了要求帐户并类似地计算用户->到->页面视图之外,您没有太多可以做的。

1
我建议使用像Redis这样的持久化键/值存储。如果您使用列表,其中列表键是序列化标识符,则可以存储其他序列化条目并使用llen查找列表大小。
例如(Python)在初始化Redis存储后:
def intializeAndPush(serializedKey, serializedValue):
    if not redisStore.exists(serializedKey):
        redisStore.push(serializedKey, serializedValue)
    else:
        if serializedValue not in redisStore.lrange(serializedKey, 0, -1):
            redisStore.push(serializedKey, serializedValue)

def getSizeOf(serializedKey):
    if redisStore.exists(serializedKey):
        return redisStore.llen(serializedKey)
    else:
        return 0

使用这种技术,您可以将任何内容用作serializedKey或serializedValue。如果您想存储带有今天日期或序列化登录信息的IP,两者都同样简单。此外,仅存储唯一的serializedValues,因为在读取时写入被锁定(至少我记得是这样)。

0

我将尝试实现像素跟踪来跟踪您页面/对象上的浏览量。这种方法被谷歌(Google Analytics)和其他高知名度媒体公司使用。


如果您有兴趣,我可以为您提供更多帮助。 - David Bonnici

0

像素跟踪很好,因为您可以将跟踪像素指向专门用于此目的的HttpHandler。这样,您可以分离负载,甚至在高负载情况下使用某种队列。

此外,您可以在跟踪像素中包含特定用户信息,例如谁访问了该页面。

例如:

<a href="fakeimages/imba.gif?uid=123&info2=a&info3=b" style="height:1px;width:1px;" />

接下来,您需要使用特定的HttpHandler / PHP重定向/控制器(无论您使用什么语言)来处理发送到fakeimages / * .gif的请求,并处理有关信息。

祝好


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接