2012-01-27 56 views
1

对于一个Web应用程序,我正在写这将是衡量频繁间隔(每分钟左右)有多少访问者在我的应用程序的特定部分中的关键。假设我的应用程序有10个小节使用JavaScript进行切换,并使用#!/page8样式哈希锚定进行持久化。准确地做这件事的最好方法是什么?如何衡量我的网页现在有多少访问者?

我目前的计划是将数量保存在数据库中,每次用户点击页面或离开页面时都会进行相加和相减。但这对我来说并不是一个很好的解决方案。由于关闭浏览器,跟踪页面叶的事件可能会被取消,人们可能会通过运行API调用来访问/离开等方式来破坏数据。获取可靠信息将是很多工作。

编辑:要指定,我的应用程序将不会有用户帐户。此外,我不只是试图记录我的网页有多少访问者。我试图准确知道我的页面现在有多少访客。这意味着我需要一些可靠的方法来了解访问者不再在我的页面上。这就是问题所在。我刚刚得到一个好主意,我可以让他们的页面上的JavaScript每10秒钟通知我的服务器,以便他们仍然在那里,并且如果他们不访问,他们的访问将被超时并被移除。这会起作用吗?如果我要让成千上万的人同时使用我的应用程序,这对我的小型服务器来说不是问题吗?

有什么想法?


我用了很多常见的Web开发标签标注这一点,因为这是一个非常开放的问题,这些标签可能包含答案

+0

为什么不使用Google Analytics或Piwik之类的东西?还有多种商业产品可以提供实时跟踪,如点击。 – mobius 2012-01-27 14:38:32

+0

为什么要用50-100行代码自己写这个模型时使用谷歌工具?并使其个性化...... – Tudor 2012-01-27 14:55:24

+0

@TudorTudor如果我们正在谈论一个高度访问的网站,我不认为50-100行代码就可以做到。或者他们可能会工作一两天。 – mobius 2012-01-27 15:01:35

回答

1

根据您的服务器容量,您可以对.php文件使用循环请求,以保持自定义会话轨迹的存在。但要小心 - 这会在服务器上造成很大的负担,所以只有在知道后果的情况下才能这样做!

使用session_start();您可以在数据库表中使用ID,ip_addr,session_track_id,timestamp等字段编写自定义会话标识符。不要使用session_id本身,因为这可能是一个安全问题。更新您调用的每个.php中的时间戳。

此外创建一个自定义.php只有时间戳更新。通过jQuery AJAX每60秒调用一次(或者任何你需要的时间间隔)。您也可以采取一些安全措施来避免您提及的直接API调用。例如,发出在AJAX调用中返回的下一个请求ID,并且需要成为下一个请求的参数,如果不是,则不会更新时间戳。

创建一个每90秒运行一次的cron(或者您需要的任何时间间隔 - 但明显比AJAX调用的时间长)。这个cron会查找表中超过X秒的条目并删除它们。

要找出活动用户的数量,只需计算表中的行数。

在此方法中可以使用其他安全选项。

这将解决您的情况 - 当用户关闭窗口时,没有AJAX调用会使会话保持活动状态,并且会在几秒钟后(在上面的场景中为90)从数据库中删除。

但是,考虑到当你每隔60秒发出一个请求,并且你有1000个在线用户时,每小时你的数据库至少有60 000个请求!强大的最优化是必须在这里...

然而,这个解决方案在我的项目中工作得很好。

+0

我'使用node.js,所以我认为负载问题不应该是一个问题。这也是我想到的解决方案,所以我喜欢它。它似乎也是目前唯一的答案,实际上解决了我如何知道用户何时离开的问题。 +1 – Hubro 2012-01-27 15:45:44

+0

这不是一个请求的问题,这是数据库查询的问题。但确定,这是可以管理的。同样想到缓存问题,你应该追加下一个请求ID,这个ID对每个请求来说都是唯一的,或者附加一个随机参数给请求,否则你可能会碰到各种浏览器的缓存问题......我会试着查找一些代码为你的样品... – Michal 2012-01-27 15:52:27

+0

对不起,找不到代码了,这是我工作了一段时间。不过,这并不难,我乐观地认为你会找到自己的路。 – Michal 2012-01-27 16:02:25

0

一种不同的方法是简单地记录每个请求的用户,日期/时间和页面。

然后,在指定的时间间隔运行一个查询,该查询会汇总显示页面和用户数量的数据。将这些结果存储在单独的表格中。

通过这种方式,您可以轻松地绘制访客历史记录以及提供最新的“当前”访问者数量响应。

一旦数据汇总完成,您显然可以从日志表中删除数据。

另一个优点是页面请求不会为每个请求锁定表。而递增/递减计数器会。根据流量水平,柜台方式会对性能产生负面影响。

通过使用日志,您可以避免锁定问题,并且实际上将卷移动到外部进程(如SQL作业)中。

0

我看到周围的网一些选项,但我个人用这一个:

我存储在数据库中的用户表中的每个时间更新用户行为时间戳(点击一个链接或左右)

您需要做的事情就是通过检查时间戳,让所有用户知道他们最后一次操作的时间是X秒。 这样你就可以得到活跃用户的姓名和他们的号码。

此外,您可以说一个人是活跃的时间是完全可配置的。

该方法我用于整个网站。 对于不同的页面,您可以使用不同的表来存储活动和页面标识或其他内容。 使用你的想象力。 :)

0

基本上你需要一台具有3个字段:

user_activity - USER_ID - last_access_timestamp - last_visited_pa​​ge

每次用户请求数据last_access_timestamp,并且必须更新last_visited_pa​​ge。 请注意,您需要手动提交#page8部分,因为它不会到达服务器!

然后,您确实需要定义何时将用户视为非活动状态。假设:15分钟。

#To get total users: 
SELECT * FROM user_activity WHERE last_access_timestamp > NOW() - 15*60; 

#To get total users for page #page8: 
SELECT * FROM user_activity WHERE last_visited_page LIKE '%page8' AND last_access_timestamp > NOW() - 15*60; 
相关问题