2012-09-06 2 views
1

기본적으로, 나는 내 사이트의 활성 사용자 수를 정확하게 측정하려고 노력하고 있습니다. DB에서 세션을 추적하고 있으며 봇/스파이더/크롤러를 제거하기 위해 USER_AGENT를 기반으로하는 정리 작업도 수행합니다 (매우 기본적인 작업 임). 동일한 IP에 대해 중복 세션을 제거한 후에도 매우 많은 수의 세션이 있습니다. 실제로 세션 수는 Google 애널리틱스 및 기타 사용자 추적 시스템에서보고하는 것보다 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); 
} 

그래서, DB에 세션 정보를 저장하고있어 다음 필요에 따라 매 15 분마다 만료/갱신 : 나는 세션을 추적 곳

다음은 코드의 일부입니다.

그런 다음 DB에서 고유 한 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 시간 전에 만료 된 모든 레코드를 삭제합니다. 30 분마다 또는 그럴 때마다하십시오.

+1

[따라서 응답에는 답변 (만료 될 수있는 링크가 아닌)이 포함되어야합니다] (http://meta.stackexchange.com/a/8259/161492). – eggyal

+0

하지만 이미 세션을 자주 지우고 있으므로 쿼리가 도움이되지 않습니다. 모든 결과는 지정한 만료 범위 내에 있습니다. cron 작업에서 삭제를 수행하는 것은 새로운 사용자가 방문하면 불필요한 delete 문을 줄이는 것이 좋습니다. – ignaciogc

+0

귀하의 의견을받지 못했습니다. 어떤 문제가 남았습니까? – HansElsen

관련 문제