以my profile为例,或者在此网站上查看任意数量的观看次数,记录网站上每页或对象的访问次数的过程是什么,我认为这包括:
问题是,计算用户请求的过程和最佳做法是什么?
修改
我已将计算机语言添加到标签列表中,因为它们对我很感兴趣。随意包含任何完成任务的库,模块和/或扩展。
问题可以改为:
答案 0 :(得分:17)
“正确”答案因情况而异;主要是最理想的统计数据以及收集和处理它们的资源的可用性: 例如:
所有网络服务器都有一些记录请求的工具。它们的问题在于它需要大量处理才能获得有意义的数据,对于您的示例场景,它们不会记录特定于应用程序的细节;比如请求是否与注册用户相关联。
此选项不适用于您感兴趣的内容。
应用程序员可以将自定义代码应用于应用程序,以将您最感兴趣的内容记录到日志文件中。这类似于webserver日志;除了可以识别应用程序并记录发出请求的成员之类的内容。
程序员可能还需要构建脚本,从这些日志中提取您最感兴趣的内容。此选项可能适用于具有大量磁盘空间的高流量站点和系统管理员,他们知道如何确保日志在发生错误之前从生产服务器进行轮换和修剪。
应用程序员可以为应用程序编写自定义代码,该代码记录数据库中的每个请求。这使得运行报告相对容易,并使数据可以立即访问。此解决方案在每个请求时产生更多的系统开销,因此更适合于较少的流量站点,或者数据受到高度重视的场景。
这是上述选项之外的考虑因素。谷歌分析就是这样做的。
每个页面都包含一些javascript代码,告诉客户端向网络服务器报告该页面已被查看。数据可能会记录在数据库中,也可能会写入文件。
在由于客户端和服务器之间的高速缓存/代理导致印象丢失的情况下,具有提高准确性的强大优势。
每次收到来自未提供cookie的人的请求时,您都认为他们是新的并记录为“匿名”,并在登录后返回唯一标识的cookie。这取决于您的应用程序,证明这是多么准确。有些应用程序不适合缓存,所以它会非常准确;其他人(高流量)鼓励缓存,这将降低准确性。显然,只要他们在切换浏览器/位置时重新进行身份验证,它就没有多大用处。
然后是关于哪些统计数据对您很重要的问题。例如,在某些情况下,您很想知道:
因此,您通常希望将其细分为一段时间才能看到趋势。 分别为:
回到你的问题:“用户进入页面时的印记数量”的最佳实践?
这取决于您的申请。
我的猜测是,您最好使用数据库支持的应用程序,该应用程序记录您的应用程序最有趣的内容,并使用cookie来跟踪成员的会话。
答案 1 :(得分:4)
点击计数器的最佳做法取决于您希望网站获得的流量。正如wybiral建议的那样,您可以在每次请求后实现写入数据库的内容。如果您想要计算唯一身份访问者,这可能包括IP地址,或者只是增加每个页面或每个(页面,用户)对的运行总计可能很简单。
但是,即使您只想提供静态页面,也需要为每个请求编写数据库。理想情况下,可扩展的Web应用程序应尽可能地从内存缓存中提供服务。应尽可能避免使用数据库或磁盘I / O.
因此理想的设置是在内存中建立服务器活动的一些表示,然后偶尔(比如每15分钟)将这些事件写入数据库。您可以想象排队数千个请求,然后使用单个数据库写入存储它们。
有一个教程描述如何使用Celery和Carrot在python中完成这个:http://packages.python.org/celery/tutorials/clickcounter.html。它还包括一些如何使用Django模型设置数据库表的示例,以及每当有人访问页面时要调用的代码。
无论您选择实施什么,本教程肯定会对您有所帮助,但如果您不希望每小时点击数千次,则此级别的体系结构可能会过度。
答案 2 :(得分:1)
使用数据库记录唯一的IP(如果数据库中不存在IP,创建它,否则按计划继续),然后在数据库中查询这些实体的数量。使用IP和URL对其进行索引,以存储各个页面的视图。您不必担心以这种方式跟踪注册用户,它们将被计入唯一的IP计数。对于来自一个IP的多个人,除了需要帐户和计算用户> to->页面视图之外,没有太多可以做的事情。
答案 3 :(得分:1)
我建议使用像Redis这样的持久性键/值存储。如果使用列表键为序列化标识符的列表,则可以存储其他序列化条目并使用llen查找列表大小。
初始化Redis商店后的示例(python):
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,因为写入在读取时被锁定(至少我记得)。
答案 4 :(得分:0)
我会尝试实施像素跟踪来跟踪您的网页/对象上的视图。谷歌(谷歌分析)和其他知名媒体公司使用此方法。
答案 5 :(得分:0)
像素跟踪会很好,因为您可以将跟踪像素指向特定于此目的的HttpHandler。这样你就可以分离负载,甚至可以使用某种队列来处理高负载情况。
此外,您可以将用户特定信息合并到跟踪像素中,例如WHO已访问该页面。
例如:
<a href="fakeimages/imba.gif?uid=123&info2=a&info3=b" style="height:1px;width:1px;" />
然后你需要使用特定的HttpHandler / php重定向/控制器(无论你使用的语言)处理伪造/ * .gif的请求并处理信息。
问候