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

Php 跟踪用户在我的网站上花费的时间,php,sql,android-activity,tracking,Php,Sql,Android Activity,Tracking,我正在编写一个用户系统,作为我所有用户的可用统计数据,我希望能够向他们提供他们在我的网站上活动的小时数 我最初的想法是: 用户加载一个页面,该用户的记录存储在一个名为accessLog的SQL表中 *用户加载另一个页面,运行sql查询以查看他们上次访问页面的时间* 如果用户在过去两分钟内访问了某个页面,请更新其用户帐户并添加在线时间 *将新记录插入accessLog* 然而,这将意味着在我的网站的每个页面上增加4个额外的查询,这似乎很慢。我在想,必须有一种更有效的方法来跟踪用户的在线活动,这显然

我正在编写一个用户系统,作为我所有用户的可用统计数据,我希望能够向他们提供他们在我的网站上活动的小时数

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


然而,这将意味着在我的网站的每个页面上增加4个额外的查询,这似乎很慢。我在想,必须有一种更有效的方法来跟踪用户的在线活动,这显然是我愚蠢到看不见的

将其添加到会话管理中。当用户开始他们的会话时,记录他们的开始时间。当用户结束会话时,记录其结束时间。从那里简单的数学将收集到他们在你的网站上每个会话花费的总时间


回答菲利普·哈格伦

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

这是真的,但话说回来,到目前为止,所有可用的答案都基于相同的基本前提:

  • 记录页面加载时间
  • 当用户离开时记录日志
  • 更新数据库表
  • 当用户离开时记录日志,您需要会话。我不知道PHP中还有什么其他方法可以像OP希望的那样跟踪用户活动。更新数据库表是一个技术问题。你想使用CRON作业吗?你想用AJAX吗?你想做点别的吗


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

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

  • 记录每个页面的加载
  • 每隔几个小时,通过计算时间的cron运行一个脚本 为每个用户在线花费,并更新用户中的运行总数 桌子
  • 定期清理访问日志表

  • 我的方法很简单:

    • 当用户加载页面时,他们的“上次页面加载时间”将在数据库中更新
    • cron脚本每分钟运行一次。它查找“最后一页加载时间”在最后一分钟的用户
    • 为找到的每个用户增加“在站点上花费的时间”
    这样,我可以随时准确地跟踪用户。只需除以60就可以得到小时数。

    两分钟规则有点不可靠——你可能会被用来计算“花费的时间”的实际含义所束缚

    在上一个项目中,我们做了以下工作

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

    我们使用datetime、GUID、页面URL和用户ID(如果用户已登录)将日志记录写入数据库

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


    这并不完全准确,但对于流量适中的站点,它可以实时运行,而不需要CRON

    我会使用ajax让客户机随时调用服务器。只需一个命令,就可以告诉服务器用户仍在查看该页面

    • 服务器将在数据库中具有lastTimestamp和TotalTimesPent。lastTimestamp只包含发生ajax请求或页面加载的最后时间

    • 每次ajax启动时,服务器都会计算
      now-lastTimestamp
      ,并将其添加到totalTimeSpentOnSite中

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

    • 首先选择会话被认为中断的持续时间。(例:10分钟)
    • 使用数据库中的所有ip记录所有页面加载
    • 如果一个ip的两次页面加载之间的时间超过持续时间,请不要将此时间添加到此ip的总时间中
    • 如果一个ip的两次页面加载之间的时间小于持续时间,则将此时间添加到此ip的总时间
    第二个问题是: -如果用户在页面中停留的时间超过10分钟而没有刷新,则视为断开连接。 -不保存最后一页的持续时间


    Piwik就是这样工作的

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

      $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)); 
    
    $now=time();
    $stmt=$db\u con->prepare(“从user\u online\u日志中选择上次看到的时间,其中user\u id=?limit?”);
    $stmt->execute(数组($user_id,1));
    $fetch=$stmt->fetch(PDO::fetch_ASSOC);
    $last_seen=$fetch['last_seen']//db中的整数值,从time()函数保存
    $last_seen_plus_one_min=$last_seen+60;
    如果($now<$last\u seen\u加上一分钟){
    $additional_time_online=$now-$last_seen;}
    else{$additional_time_online=0;}
    //更新数据库
    $stmt12=$db\u con->prepare(“更新上次查看的用户在线日志集=?,时间在线=时间在线+?其中用户id=?限制1”);
    $stmt12->执行(数组($now,$additional\u time\u online,$u