【问题标题】:Accurately count active users? (PHP + MySQL)准确统计活跃用户? (PHP + MySQL)
【发布时间】:2012-08-31 07:23:55
【问题描述】:

基本上,我一直在尝试准确衡量我的网站有多少活跃用户。我正在跟踪数据库上的会话,并基于 USER_AGENT 进行一些清理以删除机器人/蜘蛛/爬虫(虽然非常基本的东西)。 我得到的是非常多的会话,即使在删除相同 IP 的重复会话之后也是如此。事实上,会话数量是 Google Analytics 和其他用户跟踪系统报告的 10 倍,所以一定是我做错了什么。

这是我跟踪会话的部分代码:

//Start session if not active already
if(!isset($_SESSION)){
    session_start();
}

//Determine whether bot or browser
$bots = array(
    'bot',
    'crawler',
    'yahoo',
    'spider',
    'google',
    '$^'
);
$ua = $_SERVER['HTTP_USER_AGENT'];
$uam = preg_match('/'.implode('|', $bots).'/i', $ua);
$uatype = ($uam)?'bot':'browser';

//Add session to DB if new or expired
if ($_SESSION['renew'] < time() || !isset($_SESSION['renew'])) {
    $_SESSION['renew'] = time() + 900; //15 minutes
    $sql = "INSERT INTO " . SESSIONS . " (session_id, user_id,
           renew, user_ip, type, useragent) VALUES ('" . session_id() . "',
           '" . $myuser->get('user_id') . "', " . $_SESSION['renew'] . ",
           '" . $myuser->get('ip') . "', '$uatype', '$ua') 
           ON DUPLICATE KEY
           UPDATE renew = " . $_SESSION['renew'] . ",
           user_id = '" . $myuser->get('user_id') . "'";
    $site_db->query($sql);

    $sql = 'DELETE FROM ' . SESSIONS . '
           WHERE renew < ' . time();
    $site_db->query($sql);
}

所以,我将会话信息存储在数据库中,然后根据需要每 15 分钟更新/过期。

如果我随后在数据库中查询来自具有唯一 IP 地址的浏览器的会话,我会得到大约 10 倍于 JS 系统报告的会话。 即使我尝试通过仅计算 IP 地址的前两个八位字节唯一的条目来减少数量,我仍然结束了。

关于我在会话跟踪中可能做错的任何提示?

获取计数的查询如下所示:

$sql = "SELECT count(DISTINCT(user_ip) FROM ".SESSIONS." WHERE type = 'browser'";

请注意,机器人陷阱已经丢弃了大约 66% 的会话。如果我不这样做,我的“活跃用户”数量将接近 GA 报告的 40 倍。

谢谢。

【问题讨论】:

  • 哪个字段是唯一的/主要的?
  • session_id 是 SESSIONS 表的主键。

标签: php mysql session


【解决方案1】:

也许存储这些记录,然后执行如下查询:

$sql = 'SELECT COUNT(*) FROM ' . SESSIONS . ' WHERE renew BETWEEN ' . $expire-900. ' AND ' .$expire;

出于性能原因,让 cronjob 执行您的删除操作。 例如:删除一小时前过期的每条记录。并且每隔半小时或其他时间做一次。

【讨论】:

  • 但我已经经常清除会话,所以查询无济于事。所有结果都在您指定的过期范围内。至于在 cron 作业中进行删除,这是一个好主意,可以减少新用户访问时不必要的删除语句。
  • 我没有得到你的评论。现在还剩下什么问题?
  • 另外,time() 返回毫秒,而您添加的是 900 毫秒而不是 900 秒。再试一次
  • 另外,session_start 不需要那个 if 条件。什么时候是真的(更新 == '')
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 2012-11-07
  • 2014-02-16
相关资源
最近更新 更多