对于一个Web应用程序,我正在编写它是关键,以频繁的间隔(每分钟左右)测量我的应用程序的特定部分现在有多少访问者。假设我的应用程序有10个子部分,这些子部分在使用JavaScript之间切换,并使用#!/page8
样式哈希锚点进行持久化。准确地做到这一点最好的方法是什么?
我目前的计划是将数量保存在数据库中,每次用户点击页面或离开页面时添加和减去数量。这对我来说似乎不是一个非常好的解决方案。由于关闭浏览器,可以取消跟踪页面离开的事件,人们可能通过运行访问/离开的API调用来搞乱数据。获得可靠性将是很多工作。
编辑: 要指定,我的应用程序将没有用户帐户。此外,我不只是想记录我的网页有多少访问者。我正在尝试准确地知道有多少访问者 我的页面现在。这意味着我需要一些可靠的方法来了解访问者不再在我的页面上。这就是问题所在。我有一个明智的想法,我可以让他们的页面上的JavaScript通知我的服务器每10秒左右通知我们仍然存在,并且如果他们不这样做,他们的访问将被超时并被移除。那会有用吗?如果我让成千上万的人同时使用我的应用程序,这对我的微不足道的服务器来说不是一个问题吗?
有什么想法吗?
我用很多常见的网页开发标签来标记这个标签,因为它是一个非常开放的问题,任何这些标签都可以包含答案
答案 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
答案 5 :(得分:0)
基本上你需要一个包含3个字段的表:
user_activity - 用户身份 - last_access_timestamp - 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;