准确计算活跃用户? (PHP + MySQL)

时间:2012-09-06 12:59:08

标签: php mysql session

基本上,我一直在努力准确衡量我的网站有多少活跃用户。我正在跟踪数据库上的会话,并根据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地址,那么我获得的报告数量是JS系统的10倍。 即使我试图通过仅计算IP地址的前两个八位字节唯一的条目来减少数量,我仍然可以继续。

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

获取计数的查询如下:

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

作为一个说明,机器人陷阱已经丢弃了大约66%的会话。如果我不这样做,我将获得接近GA报告的40倍“活跃用户”。

感谢。

1 个答案:

答案 0 :(得分:0)

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

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

出于性能原因,让cronjob进行删除。 例如:删除一小时前过期的所有记录。每隔半小时做一次。