跟踪用户在我的网站上花费的时间

时间:2012-01-02 17:10:42

标签: php sql android-activity tracking

我正在编写一个用户系统,并为所有用户提供统计信息,我希望能够为他们提供他们在我的网站上活跃的小时数。

我最初的想法是如何做到这一点: 用户加载页面,用户的记录存储在名为accessLog 的SQL表中 *用户加载另一个页面,运行sql查询以查看他们上次访问页面的时间* 如果用户在过去两分钟内访问了某个网页,请更新其用户帐户并添加在线时间 *在accessLog *

中插入新记录

然而,这意味着可能会向我网站的每一页添加4个额外查询,这似乎很慢。我在想,必须有一种更有效的方式来跟踪用户在线活动,我显然太傻了!

7 个答案:

答案 0 :(得分:3)

我这样做很简单:

  • 当用户加载页面时,他们的“最后页面加载时间”将在数据库中更新。
  • cron脚本每分钟运行一次。它会查找“最后一页加载时间”在最后一刻的用户。
  • 为每个找到的用户增加“在网站上花费的时间”。

通过这种方式,我可以准确地跟踪用户。只需要除以60来获得时间。

答案 1 :(得分:2)

我的理念是:在成为问题之前不要过分关注效率。除非您的网站流量非常大,否则您将不会注意到这四个查询。但这可能更简单:

  1. 记录每个页面加载。
  2. 每隔几个小时,通过计算时间的cron运行一个脚本 花在线用于每个用户并更新用户的运行总计 表
  3. 定期清除access_log表。

答案 2 :(得分:2)

我会使用ajax让客户端花大约一分钟时间调用服务器。只是告诉服务器用户仍在观看该页面。

  • 服务器在数据库中具有lastTimestamp和totalTimeSpentOnSite。 lastTimestamp只是最后一次发生ajax请求或页面加载。

  • 每次ajax触发服务器时都会计算now - lastTimestamp并将其添加到totalTimeSpentOnSite。

为了使它更准确你可以 将javascript侦听器添加到onBlur()以仅记录该窗口活动所花费的实际时间,然后将该时间发送到服务器,而不是仅告诉服务器该用户仍处于活动状态。

答案 3 :(得分:1)

将其添加到会话管理中。当用户开始他们的会话记录他们的开始时间。当用户结束他们的会话记录他们的结束时间。简单的数学计算将为您收集他们在您网站上每次会话的总时间。


回答Filip Haglund

  

是的,但你必须等待会话超时,而这段时间并不反映用户在关闭之前在最后一页上花费的实际时间。

这是真的但是又一次,到目前为止所有可用的答案都在同一个基本前提下工作:

  1. 记录页面加载时间。
  2. 用户离开时记录
  3. 更新数据库表
  4. 只是在用户离开时需要会话时进行记录。我不知道PHP中的任何其他方式可以按照OP的方式跟踪用户活动。更新数据库表是一个技术问题。你想用CRON工作吗?你想使用AJAX吗?你想做别的吗?

    如果您确实想知道实际发生了多少活动,您可以发送某些JavaScript事件的AJAX请求。这会将时间跟踪与实际的浏览器事件联系起来。当然,这意味着您的时间跟踪依赖于启用JavaScript。

答案 4 :(得分:1)

“两分钟”规则有点不可靠 - 你可能会陷入困境,试图弄清楚“花费的时间”究竟意味着什么。

在之前的项目中,我们做了以下工作。

在每次加载页面时,我们检查用户是否有当前会话,如果没有,则创建一个GUID来识别当前会话。

我们使用datetime,GUID,页面URL和用户ID(如果用户已登录)向数据库写了一条日志记录。

为计算“花费的时间”,我们计算了会话GUID的第一个和最后一个记录之间的时差,并添加了一分钟以反映在最后一页上花费的时间。

这不完全准确,但它可以实时运行,而不需要CRON用于具有适度流量的站点。

答案 5 :(得分:0)

  • 首先选择会话被视为中断的持续时间。 (例如:10分钟)
  • 使用数据库中的所有IP记录所有页面加载
  • 如果一个ip的2页加载时间超过持续时间,请不要将此时间加到此ip的总时间
  • 如果一个ip的2页加载时间小于持续时间,则将此时间加到此ip的总时间

2问题是: - 如果用户在页面中停留超过持续时间(10分钟)而没有刷新,则认为他已断开连接。 - 未保存最后一页的持续时间

Piwik就是那样的

答案 6 :(得分:0)

这是我使用的方法,它在用户加载任何页面时都会检查数据库的更新。 数据是准确的,因为它会计算用户是否每分钟加载一页,如果这样,则会将时间差添加到数据库中。

  $now= time();
 $stmt = $db_con->prepare(" SELECT last_seen,time_online FROM user_online_log  WHERE user_id=?  limit ?  ");
     $stmt->execute(array( $user_id, 1));       
     $fetch= $stmt->fetch(PDO::FETCH_ASSOC);  
   $last_seen=$fetch['last_seen'];  //integer value from db, saved from time() function
  $last_seen_plus_one_min= $last_seen + 60;
  if(  $now  <   $last_seen_plus_one_min   ){ 
  $additional_time_online= $now -   $last_seen; }
  else{ $additional_time_online = 0; }


     //update db
 $stmt12 = $db_con->prepare(" update user_online_log set   last_seen=?, time_online = time_online+? WHERE user_id=?  limit 1  ");
 $stmt12->execute(array($now, $additional_time_online,  $user_id));