基本上,我一直在试图准确衡量我的网站有多少活跃用户。我正在跟踪数据库中的会话,并根据USER_AGENT进行一些清理,以删除漫游器/蜘蛛/抓取工具(尽管非常基本)。 即使在删除同一IP的重复会话之后,我所获得的会话数量也非常高。实际上,会话数量比Google Analytics和其他用户跟踪系统报告的数量大10倍,因此我必须做出错误的决定。准确计数活跃用户? (PHP + MySQL)
下面的代码的一部分,我跟踪会话:
//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倍的“活跃用户”。
谢谢。
哪个字段是唯一的/主要的? –
session_id是SESSIONS表的主键。 – ignaciogc