基本上,我一直试图准确衡量我的网站有多少活跃用户。我正在跟踪数据库上的会话,并基于 USER_AGENT 进行一些清理以删除机器人/蜘蛛/爬虫(虽然非常基本的东西)。我得到的是非常多的会话,即使在删除相同 IP 的重复会话之后也是如此。事实上,会话数量是谷歌分析和其他用户跟踪系统报告的 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 倍。
谢谢。