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

准确统计活跃用户?(PHP+MySQL),php,mysql,session,Php,Mysql,Session,基本上,我一直在努力准确地衡量我的网站有多少活跃用户。我正在跟踪数据库上的会话,还基于用户代理进行了一些清理,以删除bot/spider/crawler这些非常基本的东西。 我得到的是非常多的会话,即使在删除相同IP的重复会话之后也是如此。事实上,会话的数量是谷歌分析和其他用户跟踪系统报告的10倍,所以一定是我做错了什么 下面是我跟踪会话的部分代码: //Start session if not active already if(!isset($_SESSION)){ session_

基本上,我一直在努力准确地衡量我的网站有多少活跃用户。我正在跟踪数据库上的会话,还基于用户代理进行了一些清理,以删除bot/spider/crawler这些非常基本的东西。 我得到的是非常多的会话,即使在删除相同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);
}
值得注意的是,bot陷阱已经丢弃了大约66%的会话。如果我不这么做,我的活跃用户数量将接近GA报告的40倍


谢谢。

可能会存储这些记录,然后执行如下查询:

$sql = "SELECT count(DISTINCT(user_ip) FROM ".SESSIONS." WHERE type = 'browser'";
$sql = 'SELECT COUNT(*) FROM ' . SESSIONS . ' WHERE renew BETWEEN ' . $expire-900. ' AND ' .$expire;
出于性能原因,让cronjob执行删除操作。
例如:删除一小时前过期的所有记录。每隔半个小时或其他时间做一次。

可能会存储这些记录,然后执行如下查询:

$sql = "SELECT count(DISTINCT(user_ip) FROM ".SESSIONS." WHERE type = 'browser'";
$sql = 'SELECT COUNT(*) FROM ' . SESSIONS . ' WHERE renew BETWEEN ' . $expire-900. ' AND ' .$expire;
出于性能原因,让cronjob执行删除操作。
例如:删除一小时前过期的所有记录。每半小时或其他时间做一次。

哪个字段是唯一的/primary?会话id是会话表的主键。哪个字段是唯一的/primary?会话id是会话表的主键..但是我已经经常清除会话,所以查询没有帮助。所有结果都在您指定的过期范围内。至于在cron作业中执行delete,这是一个好主意,在新用户访问时减少不必要的delete语句。现在还剩下哪个问题?同时,时间返回毫秒,你将增加900毫秒而不是900秒。再试一次,会话启动不需要那个条件。什么时候才是真的续订==。但是我已经经常清除会话,所以这个查询不会有帮助。所有结果都在您指定的过期范围内。至于在cron作业中执行delete,这是一个好主意,在新用户访问时减少不必要的delete语句。现在还剩下哪个问题?同时,时间返回毫秒,你将增加900毫秒而不是900秒。再试一次,会话启动不需要那个条件。什么时候是真的==