0

基本: 訪問者をカウントするスクリプトがあります。一部の有用な情報は MySQL データベースに保存されます。1年以上経った今、180,000を超えるデータレコードがあり、実際の訪問者を読み取るスクリプトは非常に遅い.

訪問者をカウントし、同じ訪問者か新しい訪問者かをチェックするこのスクリプトがあります。そのために、私は 3 時間の時間範囲を持っており、この範囲の後でのみ、訪問は別の時間をカウントします。

脚本:

$besucher_query = mysql_query('SELECT `time`, `agent` FROM `besucher` ORDER BY `ip` ASC');
while($besucher = mysql_fetch_array($besucher_query)) {
    $newtime = $besucher['time'];
    $newagent = $besucher['agent'];
    $limit = 3 /*std*/ * 60 /*min*/ * 60 /*sek*/; // three hours before same visitor counts again
    $diff = $newtime - $limit;

    if($oldtime <= $diff or ($oldtime > $diff and $newagent != $oldagent))
        $besucherzahl++;

    $oldtime = $besucher['time'];
    $oldagent = $besucher['agent'];
        }
$anzahl_besucher = $besucherzahl;
echo $anzahl_besucher;

私は数年前にこのスクリプトを作成しましたが、これが最も醜い方法であることはわかっています。時刻は UNIX タイムスタンプ形式で保存されます。

ここで私の質問: 上記の条件 (3 時間ルール) でこれを MySQL で直接「グループ化」するにはどうすればよいですか?

4

2 に答える 2

1

PHP スクリプトから次のクエリを直接実行して、過去 3 時間の合計ユニーク ユーザー数を取得できます。

SELECT COUNT(DISTINCT `agent`) AS visitor_count
FROM `besucher`
WHERE `time` >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 HOUR);
于 2012-07-23T14:33:48.327 に答える
0
GROUP BY 10800*FLOOR(`time`/10800)

ただし、2:59 と 3:01 に (たとえば) レコードがある場合、これらは出力で 2 つの別個のレコードとしてレポートされます。連続した実行を測定する場合は、現在のコードと同様のことを行う必要があります-ただし、結果を再度計算しないようにDBに結果を保存できます-指定された行を参照する新しい列を追加するだけですセッションの開始:

ALTER TABLE besucher ADD COLUMN session_start INTEGER;

それで....

$limit = 3 /*std*/ * 60 /*min*/ * 60 /*sek*/;

$since=(integer)(file_get_contents('lastrun'))-$limit;
$besucher_query = mysql_query('SELECT 
      ip, `time`, `agent` FROM `besucher`
      WHERE `time`>$since 
      ORDER BY agent, ip, `time` ASC');
while($besucher = mysql_fetch_array($besucher_query)) {
   $newtime = $besucher['time'];
   $newagent = $besucher['agent'];
   $newip = $besucher['ip'];

   if ($newagent!=$oldagent 
       || $newip <> $oldip 
       || $newtime>$oldtime+$limit 
       || $newtime<$oldtime) {
     $sessionstart=$newtime;
   }
   $newagent=mysql_real_escape_string($newagent);
   mysql_query(
      "UPDATE besucher SET session_start=$sessionstart
       WHERE time=$newtime AND ip=$newip AND agent='$newagent'"
   );
   $oldtime = $besucher['time'];
   $oldagent = $besucher['agent'];
}
file_put_contents('lastrun', $oldtime);

次に、(たとえば)からセッション数を取得できます...

SELECT COUNT(*)
FROM 
(SELECT DISTINCT ip, agent, session_start
  FROM bessucher
  WHERE time BETWEEN $a AND $b) ilv

より簡単な解決策は、コードでセッション管理を使用し、これをすぐに入力することです。

于 2012-07-23T14:50:46.150 に答える