2012-09-06 50 views
1

基本上,我一直在试图准确衡量我的网站有多少活跃用户。我正在跟踪数据库中的会话,并根据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倍的“活跃用户”。

谢谢。

+0

哪个字段是唯一的/主要的? –

+0

session_id是SESSIONS表的主键。 – ignaciogc

回答

0

也许存储这些记录,然后做一个查询这样的:

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

而且由于性能原因,让一个cronjob做你删除。 例如:删除每小时前过期的每条记录。每半小时做一次。

+1

[所以答案应该包含答案,而不仅仅是链接(可能会过期)](http://meta.stackexchange.com/a/8259/161492)。 – eggyal

+0

但我已经很频繁地清理会话,因此查询无济于事。所有结果都在您指定的过期范围内。 至于在cron作业中进行删除,这是个好主意,可以在新用户访问后减少不必要的删除语句。 – ignaciogc

+0

我没有得到您的评论。现在剩下哪个问题? – HansElsen