如何衡量我的网页现在有多少访问者?

时间:2012-01-27 14:34:48

标签: php asp.net ruby apache

对于一个Web应用程序,我正在编写它是关键,以频繁的间隔(每分钟左右)测量我的应用程序的特定部分现在有多少访问者。假设我的应用程序有10个子部分,这些子部分在使用JavaScript之间切换,并使用#!/page8样式哈希锚点进行持久化。准确地做到这一点最好的方法是什么?

我目前的计划是将数量保存在数据库中,每次用户点击页面或离开页面时添加和减去数量。这对我来说似乎不是一个非常好的解决方案。由于关闭浏览器,可以取消跟踪页面离开的事件,人们可能通过运行访问/离开的API调用来搞乱数据。获得可靠性将是很多工作。

编辑: 要指定,我的应用程序将没有用户帐户。此外,我不只是想记录我的网页有多少访问者。我正在尝试准确地知道有多少访问者 我的页面现在。这意味着我需要一些可靠的方法来了解访问者不再在我的页面上。这就是问题所在。我有一个明智的想法,我可以让他们的页面上的JavaScript通知我的服务器每10秒左右通知我们仍然存在,并且如果他们不这样做,他们的访问将被超时并被移除。那会有用吗?如果我让成千上万的人同时使用我的应用程序,这对我的微不足道的服务器来说不是一个问题吗?

有什么想法吗?


我用很多常见的网页开发标签来标记这个标签,因为它是一个非常开放的问题,任何这些标签都可以包含答案

6 个答案:

答案 0 :(得分:1)

我自己没有尝试过,但您可以查看一些工具,例如http://mixpanel.com/

答案 1 :(得分:1)

根据您拥有的服务器容量,您可以对.php文件使用重复请求,以保持自定义会话跟踪的活动状态。但要注意 - 这会导致服务器上的负载,所以只有在你意识到后果的情况下才会这样做!

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

另外创建一个自定义.php,其中只更新时间戳。每60秒(或您需要的任何时间间隔)通过jQuery AJAX调用调用此方法。您也可以在此步骤中使用一些安全性来避免您提到的直接API调用。例如,发出在AJAX调用中返回的下一个请求ID,并且需要是下一个请求的参数,如果不是,则时间戳不会被更新。

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

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

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

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

但是 - 考虑到当您每60秒发出一次请求并且您有1000个在线用户时,它每小时至少会向您的数据库发出60 000个请求!强大的优化是必须的.​​.....

然而,在一个项目中,这个解决方案对我来说很好。

答案 2 :(得分:0)

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

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

通过这种方式,您可以轻松绘制访问者历史记录,并对“当前”访问者的数量做出最新响应。

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

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

通过使用日志,您可以避免锁定问题,并基本上将汇总移动到外部进程(如SQL作业)。

答案 3 :(得分:0)

我在网上看到了一些选项,但我个人使用这个:

我在数据库的users表中存储一个时间戳,每次用户操作时都会更新(点击链接等)

您需要做的是通过检查时间戳让所有用户在X秒前完成他们的上一次操作。 这样,您就可以获得活动用户的名称及其编号。

此外,您可以说一个人处于活动状态是完全可配置的。

我用于整个网站的方法。 对于不同的页面,您可以使用不同的表来存储活动和页面ID等。 动用你的想象力。 :)

答案 4 :(得分:0)

最好使用Google Analytics

http://www.google.com/analytics/

答案 5 :(得分:0)

基本上你需要一个包含3个字段的表:

user_activity  - 用户身份   - 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;