ACCESSアナライザーUG アップグレード

 KOMONETで無料配布している、設置がより簡単で多機能なアクセス解析スクリプトをこちらで解説したいと思います。通常のHTMLページにJavaScriptを埋め込み、解析用PHPスクリプトを呼び出すようにしています。解析内容は「時間毎のアクセス数」「日毎のアクセス数」「ホスト毎のアクセス数」「ブラウザ毎のアクセス数」「接続元毎のアクセス数」です。

解析用HTMLページ

 通常のHTMLページに以下のJavaScript文を埋め込みます。以下は、ここのトップページに実際に埋め込まれているものです。ご自分のホームページに設置する際は、ご自分の環境に読み替えて修正して下さい。

<SCRIPT Language="JavaScript">
<!--

document.write("<p align=center><a href=http://www.komonet.ne.jp/~php/komoana/komoana.php?action=view&timeflag=1>");

document.write("<img src=http://www.komonet.ne.jp/~php/komoana/komoana2.php?" + document.referrer + " border=0></a></p>");

// -->
</SCRIPT>

PHPスクリプト

 これはKOMONETで無料配布しているスクリプトと同じ内容のものです。実際の動作は、ここのトップページの最下部に埋め込まれている「KOMOアナライザー」をご参照下さい。

 従来のスクリプトとの大きな違いは、アクセス数の割合を表示するグラフ棒の長さです。従来のものは、100%に当たるグラフ棒の長さを決め、それに対してアクセス数の割合をグラフ棒の長さで表示していました。しかしこれでは、各値の割合が全般的に低い場合、グラフ棒の長さが非常に短くなり、全体的な差異が把握しにくくなってしまいます。これに対し、今回のスクリプトでは、一番多いアクセス数を100%として一定の長さに決め、この最大値に対する各値の割合をそれぞれの長さに換算して表示しています。

komoana.php

<?php PHP開始の合図。
//=================初期設定==================
$title = 'KOMOアナライザー';
$date_now = date("Y/m/d(D)"); //日付の取得
$hour = date("H"); //時刻の取得
$gazou = './komo_ana.jpg';
$graph_img = './cnt.gif';
$graph_img2 = './cnt2.gif';
$data_file = './ana.dat'; //データファイル
$max = 2000; //最大記録数
$hostview = 30;
$agentview = 50;
$hrefview = 50;
$graphview = 100;
$date_max = 30;
$time_max = 24;
初期設定です。
大方の設定は、この部分で変更可能です。
//=================データ分析==================
if($action == 'view'){
 $v_data = file($data_file);
 $v_cnt = count($v_data);
 for($i=0; $i<$v_cnt; $i++){
  list($da,$ho,$ag,$hf,$hr) = split("<>", $v_data[$i]);
  $DA[$da]++; //日付毎の集計
  if($timeflag > 0){
   if($date_now == $da){
    $TI[$hr]++; //時間毎の集計
   }
  }else{
   $TI[$hr]++; //時間毎の集計
  }
  $HO[$ho]++; //ホスト毎の集計
  $AG[$ag]++; //ブラウザ毎の集計
  $HF[$hf]++; //リンク元毎の集計
 }
アクセス解析をするページ本体で、解析結果を表示する為のボタンを押すと($action == 'view')、まずここの基本的なデータ分析が行われます。

データの総数をカウントし、それぞれの要素を連想配列に格納して行く事によって、それぞれの総カウント数も取得します。
 //並べ替え
 if($v_cnt > 0){
  while(list($key,$value)= each($DA)){
   $dummy = "$key<>$value";
   $DATE[] = "$dummy";
   $s = sprintf("%04d", $value);
   $dummy2 = "$s<>$key<>$value";
   $DATE2[] = "$dummy2";
  }
  list($d,$datecount) = split("<>", $DATE[0]);
  rsort($DATE2);
  list($d,$e,$max_date) = split("<>", $DATE2[0]);
 }
最初の条件式は、データが存在しない時のエラー対策です。日付毎のデータを処理します。

連想配列
$DAのキーと値を取得し、それぞれを配列変数$DATEに格納します。又、最大値を取得する為に配列変数$DATE2も設けています。

配列変数
$DATE[0]の値から、当日のカウント総数$datecountを取得します。

更に、変数
$sの値を基に配列変数$DATE2を並べ替え、配列変数$DATE2[0]の値からカウントの最大値を取得します。
 if($v_cnt > 0){
  while(list($key,$value)= each($TI)){
   $dummy = "$key<>$value";
   $TIME[] = "$dummy";
   $s = sprintf("%04d", $value);
   $dummy2 = "$s<>$key<>$value";
   $TIME2[] = "$dummy2";
  }
  rsort($TIME2);
  list($d,$e,$max_time) = split("<>", $TIME2[0]);
 }
時間毎のデータを処理します。

処理内容は上の日付毎のデータ処理と同じです。
 if($v_cnt > 0){
  while(list($key,$value)= each($HO)){
   $s = sprintf("%04d", $value);
   $dummy = "$s<>$key<>$value";
   $HOST[] = "$dummy";
  }
  rsort($HOST);
  list($d,$e,$max_host) = split("<>", $HOST[0]);
 }
ホスト毎のデータを処理します。

連想配列
$HOのキーと値を取得し、それぞれを配列$HOSTに格納します。変数$sは、データを降順に並び替える(rsort)為のダミー変数です。
 if($v_cnt > 0){
  while(list($key,$value)= each($AG)){
   $s = sprintf("%04d", $value);
   $dummy = "$s<>$key<>$value";
   $AGENT[] = "$dummy";
  }
  rsort($AGENT);
  list($d,$e,$max_agent) = split("<>", $AGENT[0]);
 }
ブラウザ毎のデータを処理します。

連想配列$AGのキーと値を取得し、それぞれを配列$AGENTに格納します。変数$sは、データを降順に並び替える(rsort)為のダミー変数です。
 if($v_cnt > 0){
  while(list($key,$value)= each($HF)){
   $s = sprintf("%04d", $value);
   $dummy = "$s<>$key<>$value";
   $HREF[] = "$dummy";
  }
  rsort($HREF);
  list($d,$e,$max_href) = split("<>", $HREF[0]);
 }
リンク元毎のデータを処理します。

連想配列$HFのキーと値を取得し、それぞれを配列$HREFに格納します。変数$sは、データを降順に並び替える(rsort)為のダミー変数です。
 //===================HTML出力==================
 echo "<html><head><title>$title</title></head>\n";
 echo "<body bgcolor=#ffffff text=#000000 link='red' vlink='red'>\n";
 echo "<center>\n";
 echo "<img src=./banner.gif><br>\n";
 echo "<font color='green'><b><最新 $max アクセスの解析結果></b></font>\n";
 echo "<p>現在のサンプル数 $v_cnt アクセスです。</p>\n";
 echo "<table border=1 cellspacing=0 width=90%>\n";
HTML出力します。最初の部分です。
 //本日の時間別統計
 if($timeflag > 0){
  echo "<caption>本日 $date_now の時間別統計<br>\n";
  echo "<font size=2>[<a href=$PHP_SELF?action=view&timeflag=0>データ全体を見る</a>]</font></caption>\n";
 } else {
  echo "<caption>データ全体の時間別統計<br>\n";
  echo "<font size=2>[<a href=$PHP_SELF?action=view&timeflag=1>本日のデータを見る</a>]</font></caption>\n";
 }
当日の時間別統計を表示します。当日とデータ全体とを切り分けて表示します。
 echo "<tr><td bgcolor=#ffccff><font size=2>グラフ</font></td>\n";
 if($time_max > count($TIME)){ $time_max = count($TIME); }
 for($i=0; $i<24; $i++){
  for($j=0; $j<$time_max; $j++){
   list($d,$c) = split("<>", $TIME[$j]);
   if($c > 0 && $i == $d){
    $chrlen = $c / $max_time * $graphview;
    break;
   } else {
    $chrlen = 0;
   }
  }
  echo "<td align=center valign=bottom><img src=$graph_img2 width=10 height=$chrlen></td>\n";
 }
 echo "</tr>\n";
グラフ図形を表示します。時間表示は24時間全てにしていますので、ループ処理を二重にして、該当するデータだけを取り出しています。条件式「$i == $d」は、セルを表す変数$iが時間を表す変数$dと等しければ、と言う意味です。条件が合致すれば、break文によって内部ループを抜けます。
 echo "<tr><td bgcolor=#ffccff><font size=2>時間</font></td>\n";
 for($i=0; $i<24; $i++){
  echo "<td>$i</td>\n";
 }
 echo "</tr>\n";
時間の表示部分は簡単です。変数$iをそのまま順に表示します。
 echo "<tr><td bgcolor=#ffccff><font size=2>カウント</font></td>\n";
 if($time_max > count($TIME)){ $time_max = count($TIME); }
 for($i=0; $i<24; $i++){
  for($j=0; $j<$time_max; $j++){
   list($d,$c) = split("<>", $TIME[$j]);
   if($c > 0 && $i == $d){
    $c2 = $c;
    break;
   }else{
    $c2 = 0;
   }
  }
  echo "<td>$c2</td>\n";
 }
 echo "</tr>\n";
カウント数を表示します。ここの処理は、グラフ表示部分とほほ同じです。条件に合致したデータを取得し、そのまま表示します。
 echo "<tr><td bgcolor=#ffccff><font size=2>ポイント(%)</font></td>\n";
for($i=0; $i<24; $i++){
  for($j=0; $j<$time_max; $j++){
   list($d,$c) = split("<>", $TIME[$j]);
   if($c > 0 && $i == $d){
    if($timeflag > 0){
     $per = $c / $datecount * 100;
     break;
    }else{
     $per = $c / $v_cnt * 100;
     break;
    }
   }else{
    $per = 0;
   }
  }
  echo "<td>\n";
  printf("%10.1f", $per);
  echo "<BR>%</td>\n";
 }
 echo "</tr></table><br>\n";
ポイント数を表示します。ここの処理も上と同様です。
 //日別統計
 echo "<table border=0 cellpadding=0 cellspacing=0 width=90%>\n";
 echo "<tr><td valign=top width=49%>\n";
 echo "<table border=1 cellspacing=0 width=100%>\n";
 echo "<caption>日別統計(最大 $date_max 日)</caption>\n";
 echo "<tr><td align=center bgcolor=#ffccff><font size=2>日付</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>カウント</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>ポイント</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>グラフ</font></td></tr>\n";
 if($date_max > count($DATE)){ $date_max = count($DATE); }
 for($i=0; $i<$date_max; $i++){
  list($d,$c) = split("<>", $DATE[$i]);
  if($v_cnt == 0){
   $per = 0;
   $chrlen = 0;
  }else{
   $per = $c / $v_cnt * 100;
   $chrlen = $c / $max_date * $graphview;
  }
  echo "<tr><td>$d</td>\n";
  echo "<td align=right>$c</td>\n";
  echo "<td align=right>\n";
  printf("%10.1f", $per);
  echo "%</td>\n";
  echo "<td><img src=$graph_img width=$chrlen height=10></td></tr>\n";
 }
 echo "</table>\n";
 echo "</td><td width=2%></td><td valign=top width=49%>\n";
日別統計を表示します。

処理の内容については、上記のものとほぼ同じです。
 //ホスト別統計
 echo "<table border=1 cellspacing=0 width=100%>\n";
 echo "<caption>ホスト別統計(最大 $hostview 件)</caption>\n";
 echo "<tr><td align=center bgcolor=#ffccff><font size=2>ホスト名</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>カウント</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>ポイント</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>グラフ</font></td></tr>\n";
 if($hostview > count($HOST)){ $hostview = count($HOST); }
 for($i=0; $i<$hostview; $i++){
  list($s,$h,$c) = split("<>", $HOST[$i]);
  if($c != 0){
   if($v_cnt == 0){
    $per = 0; $chrlen = 0;
   }else{
    $per = $c / $v_cnt * 100;
    $chrlen = $c / $max_host * $graphview;
   }
  }
  echo "<tr><td>$h</td>\n";
  echo "<td align=right>$c</td>\n";
  echo "<td align=right>\n";
  printf("%10.1f", $per);
  echo "%</td>\n";
  echo "<td><img src=$graph_img width=$chrlen height=10></td></tr>\n";
 }
 echo "</table>\n";
 echo "</td></tr></table><br>\n";
ホスト別統計を表示します。

処理の内容については、上記のものとほぼ同じです。
 //ブラウザ別統計
 echo "<table border=1 cellspacing=0 width=90%>\n";
 echo "<caption>ブラウザ別統計(最大 $agentview 件)</caption>\n";
 echo "<tr><td align=center bgcolor=#ffccff><font size=2>ブラウザ名</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>カウント</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>ポイント</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>グラフ</font></td></tr>\n";
 if($agentview > count($AGENT)){ $agentview = count($AGENT); }
 for($i=0; $i<$agentview; $i++){
  list($s,$a,$c) = split("<>", $AGENT[$i]);
  if($c != 0){
   if($v_cnt == 0){
    $per = 0; $chrlen = 0;
   }else{
    $per = $c / $v_cnt * 100;
    $chrlen = $c / $max_agent * $graphview;
   }
  }
  echo "<tr><td>$a</td>\n";
  echo "<td align=right>$c</td>\n";
  echo "<td align=right>\n";
  printf("%10.1f", $per);
  echo "%</td>\n";
  echo "<td><img src=$graph_img width=$chrlen height=10></td></tr>\n";
 }
 echo "</table><br>\n";
ブラウザ別統計を表示します。

処理の内容については、上記のものとほぼ同じです。
 //リンク元別統計
 echo "<table border=1 cellspacing=0 width=90%>\n";
 echo "<caption>リンク元別統計(最大 $hrefview 件)</caption>\n";
 echo "<tr><td align=center bgcolor=#ffccff><font size=2>リンク元</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>カウント</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>ポイント</font></td>\n";
 echo "<td align=center bgcolor=#ffccff><font size=2>グラフ</font></td></tr>\n";
 if($hrefview > count($HREF)){ $hrefview = count($HREF); }
 for($i=0; $i<$hrefview; $i++){
  list($s,$l,$c) = split("<>", $HREF[$i]);
  if($c != 0){
   if($v_cnt == 0){
    $per = 0; $chrlen = 0;
   }else{
    $per = $c / $v_cnt * 100;
    $chrlen = $c / $max_href * $graphview;
   }
  }
  echo "<tr><td>\n";
  if($l){
   echo "<a href=$l target=_blank>" . $l . "</a>";
  }else{
   echo "none";
  }
  echo "</td>\n";
  echo "<td align=right>$c</td>\n";
  echo "<td align=right>\n";
  printf("%10.1f", $per);
  echo "%</td>\n";
  echo "<td><img src=$graph_img width=$chrlen height=10></td></tr>\n";
 }
 echo "</table></center>\n";
リンク元別統計を表示します。

処理の内容については、上記のものとほぼ同じです。
 unset($v_data); 指定した変数の割り当てを解除します。
}else{
 //クッキー書き込み
 $cookie = $date_now;
 setcookie("Cookie_php","$cookie");
重複のない正確なデータを採る為に、クッキーに接続時の日付情報を書き込みます。
 //データ書き込み
 if($Cookie_php != $date_now){
クッキーから得た日付情報と、接続時の日付情報とが異なっていれば、データファイルに書き込みをします。
  //ホスト名を取得
  $host = getenv("REMOTE_HOST");
  $addr = getenv("REMOTE_ADDR");
  if($host == "" || $host ==$addr){
   $host = gethostbyaddr($addr);
   if($host != $addr){
    if(eregi(".+\.(.+)\.(.+)\.(.+)$", $host, $regs)){
     $host = "*." . $regs[1] . "." . $regs[2] . "." . $regs[3];
    }elseif(eregi(".+\.(.+)\.(.+)$", $host, $regs)){
     $host = "*." . $regs[1] . "." . $regs[2];
    }elseif(eregi(".+\.(.+)$", $host, $regs)){
     $host = "*." . $regs[1];
    }else{
     $host = "on the internet";
    }
   }else{
    $host = $addr;
   }
  }
  //訪問者のブラウザを取得
  $agent = getenv("HTTP_USER_AGENT");
  //リンク元を取得
  $href = getenv("QUERY_STRING");
  $ana_data = file($data_file);
  $value = "$date_now<>$host<>$agent<>$href<>$hour\n";
  $fp = fopen($data_file, "w");
  rewind($fp);
  fputs($fp, $value);
  //最大記録数の調整
  if($max <= count($ana_data)){
   $ana_num = $max - 1;
  }else{
   $ana_num = count($ana_data);
  }
  for($i = 0; $i < $ana_num; $i++){
   fputs($fp, $ana_data[$i]);
  }
  fclose($fp);
  unset($ana_data);
 }
 header("Content-type: image/jpg");
 readfile($gazou);
}
この部分の処理内容は、掲示板スクリプトなどで見られるものと一緒です。
?> PHP終了の合図。

 *上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。

HOME