2

基本的に、私は自分のサイトのアクティブ ユーザー数を正確に測定しようとしてきました。私はDBでセッションを追跡しており、ボット/スパイダー/クローラーを削除するためにUSER_AGENTに基づいていくつかのクリーンアップも行っています(ただし非常に基本的なものです)。同じ IP の重複セッションを削除した後でも、非常に多くのセッションが表示されます。実際、セッション数は Google アナリティクスや他のユーザー トラッキング システムが報告する数の 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);
}

そのため、セッション情報をDBに保存し、必要に応じて15分ごとに更新/期限切れにしています。

次に、一意の IP アドレスを使用してブラウザーからのセッションについて DB にクエリを実行すると、JS システムが報告している数の約 10 倍の数が得られます。IP アドレスの最初の 2 オクテットが一意であるエントリだけを数えて数を減らそうとしても、まだやり過ぎです。

セッション追跡で何が間違っている可能性があるかについてのヒントはありますか?

カウントを取得するクエリは次のようになります。

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

注意として、ボット トラップはすでにセッションの約 66% を破棄しています。そうしなければ、GA レポートの 40 倍近くの「アクティブ ユーザー」を獲得できたでしょう。

ありがとう。

4

1 に答える 1

0

おそらくそれらのレコードを保存してから、次のようなクエリを実行します。

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

また、パフォーマンス上の理由から、cronjob に削除を任せてください。例: 1 時間前に有効期限が切れたすべてのレコードを削除します。そして、それを30分ごとに行います。

于 2012-09-06T13:00:41.407 に答える