我如何衡量我的页面目前有多少访问者


How do I measure how many visitors my page has right now?

对于我正在编写的web应用程序,关键是要经常(每分钟左右)测量我的应用程序的特定部分中有多少访问者。假设我的应用程序有10个子部分,它们在使用JavaScript和使用#!/page8风格的哈希锚点之间进行切换。准确地做到这一点的最佳方法是什么?

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

编辑: 若要指定,我的应用程序将没有用户帐户。此外,我不只是想记录我的页面有多少访问者。我正在努力准确地了解我的页面上有多少访问者。这意味着我需要一些可靠的方法来了解访问者是否已不在我的页面上。这就是问题所在。我刚刚有了一个好主意,我可以让他们页面上的JavaScript每隔10秒左右通知我的服务器,他们仍然在那里,如果他们不在,他们的访问就会超时并被删除。这样行吗?如果我要让成千上万的人同时使用我的应用程序,这对我的小服务器来说难道不是一个问题吗?

有什么想法吗?


我用很多常见的web开发标签对此进行标记,因为这是一个非常开放的问题,其中任何一个标签都可能包含答案

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

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

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

创建一个每90秒运行一次的cron(或者您需要的任何时间间隔,但显然比AJAX调用中的时间间隔更长)。这个cron将在表中查找早于X秒的条目并将其删除。

要找出活动用户的数量,只需数一下表中的行即可。

在这种方法中可以采用其他安全选项。

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

然而,考虑一下,当你每60秒发出一个请求,并且你有1000个用户在线时,你的数据库每小时至少有60000个请求!强大的优化在这里是必须的。。。

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

我自己还没有尝试过,但你可以签出一些工具,比如http://mixpanel.com/

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

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

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

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

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

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

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

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

然后你需要做的就是通过检查时间戳,让所有用户知道他们的最后一次操作是在X秒前。这样,您就可以将活动用户的名称和他们的号码一起显示出来。

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

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

最好使用谷歌分析

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

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

用户活动-user_id-上次访问时间戳-last_visited_page

每次用户请求数据时,last_access_timestamp和last_visited_page都必须更新。请注意,您需要手动提交#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;