maxdate = $_maxdate; $this->host = getenv("HTTP_HOST"); } //----- ログファイル一覧を取り出す function logfiles(){ $ret_code = false; $_dir = dir($this -> datafilepath); $_pattern = "^".$this -> datafilename."([0-9]{8})".$this -> datafileext; while($_entry = $_dir -> read()){ if (ereg($_pattern,$_entry)){ $ret_code = true; $_logfiles[] = $_entry; } } $_dir -> close(); if(!$ret_code) { return false; } else { return $_logfiles; }; } //----- 表示テンプレ function template($_array = "",$_title = "",$_min = 0) { if ($_array != "") { print "\n"; if (is_array($_title)){ print ""; foreach($_title as $v){ print ""; } print "\n"; } foreach($_array as $_key => $_val) { if($_min > 0){ if($_val < $_min) break; } //----- if(is_array($_val)){ $_key = ""; arsort($_val); foreach($_val as $_key2 => $_val2){ print "$_key\n"; $_key = ""; } } else { print "\n"; } } print "
$v
$_key
$_key2$_val2
$_key$_val

\n"; } } function template_hour($_array = "") { if ($_array != "") { print ""; print ""; foreach($this->timetable as $k){ print ""; } print "\n"; $psum=0; $pmax=0; print ""; foreach($this->timetable as $k){ if($_array[$k]=="")$v=0;else $v=$_array[$k]; print ""; $psum+=$v; if($v>$pmax)$pmax=$v; } print "\n"; if($pmax>0){ print ""; $pmax=$pmax/5; foreach($this->timetable as $k){ if($_array[$k]=="")$v=0;else $v=$_array[$k]; $c=$v/$pmax; $s=""; for($i=0;$i<$c;$i++) $s .= '★
'; if($s=="")$s="☆"; print ""; } } print "\n"; print "
$k
$v$psum
bgcolor_tr}>$sbgcolor_tr}>☆





"; } } /* 日毎表示 日付縦バージョン */ function template_day($_array = "",$_array2 = "") { if ($_array != "" && $_array2 != "") { foreach($_array as $k=>$v){ $d[] = $k; foreach($v as $_k=>$_v){ $p[$_k] +=$_v; } } arsort($p); $i = 0; print ""; print ""; foreach($p as $k=>$v){ print ""; ++$i; } print "\n"; print "
ファイル番号ファイル名
$i$k

\n"; print ""; print ""; //foreach($p as $k=>$v) print ""; for($i=0;$i$i"; print "\n"; unset($p2sum); foreach($d as $dt){ $dsum = 0; $d2sum = 0; print ""; foreach($p as $pname => $psum){ $p2sum[$pname] += $_array2[$dt][$pname]; $dsum += $_array[$dt][$pname]; $d2sum += $_array2[$dt][$pname]; print ''; } print ""; } print "\n"; print ""; foreach($p as $k=>$v){ $ppsum +=$v; $pp2sum +=$p2sum[$k]; print ""; } print ""; print "\n"; print "
日付$k総計
".substr($dt,4,2)."/".substr($dt,6,2)."'.$_array[$dt][$pname].'('.$_array2[$dt][$pname].')$dsum($d2sum)
総計$v({$p2sum[$k]})$ppsum($pp2sum)

\n"; } } /* 日毎表示 日付横バージョン function template_day($_array = "",$_array2 = "") { if ($_array != "" && $_array2 != "") { print ""; foreach($_array as $k=>$v){ $d[] = $k; foreach($v as $_k=>$_v){ $p[$_k] +=$_v; } } print ""; foreach($d as $v) print ""; print "\n"; arsort($p); foreach($p as $pname => $psum){ print ""; $p2sum = 0; foreach($d as $dt){ $p2sum += $_array2[$dt][$pname]; $dsum[$dt] += $_array[$dt][$pname]; $d2sum[$dt] += $_array2[$dt][$pname]; print ''; } print ""; } print "\n"; print ""; foreach($dsum as $k=>$v){ $ddsum +=$v; $dd2sum +=$d2sum[$k]; print ""; } print ""; print "\n"; print "
ファイル名".substr($v,4,2)."/".substr($v,6,2)."
$pname'.$_array[$dt][$pname].'('.$_array2[$dt][$pname].')$psum($p2sum)
総計$v({$d2sum[$k]})$ddsum($dd2sum)

\n"; } } */ //----- ログデータ表示 function view_log($_fn,$_time){ $cc = new convert_chr(); //----- データの読み込み $_fp = fopen($this->datafilepath.$_fn[0],"r"); $max = 30; $c = 0; $i=0; if($_time!='new'){ $_time +=0; $_time = $this->timetable[$_time]; $flg = 0; while ($_data = fgetcsv($_fp,2000)){ $tm = $_data[1]; if($_time==gmdate("H",$tm+9*60*60)){ $dt[$c] = $_data; $flg = 1; ++$c; } elseif($flg==1) break; if($c>$max){ unset($dt[$i]); ++$i;} } } else { while ($_data = fgetcsv($_fp,2000)){ $dt[$c] = $_data; ++$c; if($c>$max){ unset($dt[$i]); ++$i;} } } if(!is_array($dt)){ print "指定時のアクセスはありません.
\n"; exit;} $dt = array_reverse($dt); foreach($dt as $v){ if($v[4] != ""){ $_u = parse_url($v[4]); $_q = $_u['query']; if($_q != ""){ $_q = rawurldecode($_q); // $_ccode = i18n_discover_encoding($_q); // $_q = i18n_convert($_q, "EUC-JP", $_ccode); $_q = $cc->convert($_q); $v[4] = $_u["scheme"]."://".$_u["host"].$_u["path"]."
クエリ:$_q"; } } $_newlog[] = gmdate("Y/m/d H:i:s",$v[1]+9*60*60)."
".$v[0]."
".$v[2]." ; ".$v[5]."
".$v[3]."
".$v[4]; } print "
最新30件のアクセスログ
"; $this -> template($_newlog,array("最新ログ","時間,閲覧ページ,IPアドレス・ホスト,エージェント,リンク元")); fclose($_fp); } //----- 分析データ表示 function view_ana($_fn,$_mode){ $cc = new convert_chr(); //----- データの読み込み foreach($_fn as $_filename){ $_fp = fopen($this->datafilepath.$_filename,"r"); $_fnlen = strlen($this -> datafilename); $_datestr = substr($_filename,$_fnlen,8); if(ereg('r',$_mode)){ // 0:phppath 1:time 2:ip 3:agent 4:referer 5:remotehost $query_word = array('q','p','MT','query','qt','Text','search'); while ($_data = fgetcsv($_fp,2000)){ $pp = $_data[0]; $rh = $_data[5]; $ref = $_data[4]; //----- 関連URLチェック用 $url_a = $this->host.$pp; //実行URL $b = explode("/",$ref); //リンク元最短URL作成 $url_b = $b[2]."/"; if(count($b)>4) $url_b .= $b[3]."/"; $flg = ereg($url_b,$url_a); //----- 検索文字列のデコード if($flg){ $ref=$this->host; } elseif($ref != ""){ $_u = parse_url($ref); $_q = $_u['query']; if($_q != ""){ $_q = rawurldecode($_q); // $_ccode = i18n_discover_encoding($_q); // $_q = i18n_convert($_q, "EUC-JP", $_ccode); $_q = $cc->convert($_q); $ref = $_u["scheme"]."://".$_u["host"].$_u["path"]; //----- 検索文字列の分離 $flagq = true; $_qs = explode('&',$_q); foreach($_qs as $_v){ $_qs2 = explode('=',$_v); if(in_array($_qs2[0],$query_word)){ $_qs3 = explode('+',$_qs2[1]); foreach($_qs3 as $__v){ $__v = strtolower($__v); $__v = str_replace(' ',' ',$__v); $_qs4 = explode(' ',$__v); foreach($_qs4 as $___v){ if($___v != '' && $___v != ' '){ $_query[$_u["host"]][$___v] +=1; $_query2[$___v] +=1; } } } $flagq = false; break; } } if($flagq){ $_query[$_u["host"]][$_q] +=1; $_query2[$_q] +=1; } } } else $ref = '-'; $_ref[$ref] +=1; } } else { $jpd = array('co','ne','ac','or','go','gr','ad'); while ($_data = fgetcsv($_fp,2000)){ $pp = $_data[0]; $rh = $_data[5]; $tm = $_data[1]; $_day[$_datestr][$pp] +=1; $_day_f[$_datestr][$pp][$rh] +=1; $_hour[gmdate("H",$tm+9*60*60)] +=1; //$_rh[$rh] +=1; //----- リモートホストチェック $ss = explode('.',$rh); $cs = count($ss) -1; $dm = strtolower($ss[$cs]); --$cs; if(is_numeric($dm)){ $dm = 'IP Address'; $rh = "{$ss[0]}.{$ss[1]}.{$ss[2]}.*"; } elseif($dm=='jp' && in_array(strtolower($ss[$cs]),$jpd)) { $dmj = strtolower($ss[$cs]); --$cs; $_dmj[$dmj] +=1; $rh = $ss[$cs].".".$dmj.'.jp'; } else { $rh= $ss[$cs].".".$dm; } $_dm[$dm] +=1; $_rh[$rh] +=1; } } fclose($_fp); } if(ereg('r',$_mode)){ arsort($_ref); print "
参照元情報
"; $this->template($_ref,array('参照元','回数')); if(is_array($_query2)){ arsort($_query2); print "
検索ワード情報
"; $this->template($_query2,array('検索ワード','回数')); arsort($_query); print "
検索ワード情報(参照ホスト別)
"; $this->template($_query,array('参照ホスト','検索ワード','回数')); } } else { foreach($_day_f as $k=>$v){ foreach($v as $_k=>$_v){ $_day_f2[$k][$_k] = count($_v); } } unset($_day_f); print "
時間ごとの閲覧回数推移
"; $this->template_hour($_hour); print "
ページ毎の閲覧回数
"; print "
※カッコ内は同一アドレスからの複数アクセスを1回とカウントした回数.
"; $this->template_day($_day,$_day_f2); //if(ereg('w',$_mode)) $c=5; else $c=2; if(ereg('w',$_mode)) $c=$this->maxdate; else $c=2; print "
$c 回以上アクセスのあったホスト名
"; arsort($_rh); $this->template($_rh,array('ホスト名','回数'),$c); print "
ドメイン
"; arsort($_dm); $this->template($_dm,array('ドメイン','回数')); print "
JPドメイン内訳
"; arsort($_dmj); $this->template($_dmj,array('ドメイン','回数')); } } //----- ログの表示(override) function view($_datestr = "",$_mode = "",$_time = ""){ if($_mode == "") $_mode = "d"; if($_time == "") $_time = "new"; // mode w:week l:log r:refer //----- 指定日ログの存在確認 if ($_datestr == "") $_datestr = date("Ymd"); if(!file_exists($this->datafilepath.$this->datafilename.$_datestr.$this->datafileext)){ $this -> errormessage = "logfile not found."; return false; } if(ereg("w",$_mode)){ //----- 過去数日分のログファイル名取得 $_logfiles = $this -> logfiles(); rsort($_logfiles); $_currentfn = $this -> datafilename.$_datestr.$this->datafileext; $_ary = array_keys($_logfiles,$_currentfn); //読み込み日付のインデックスを検索 $_cstart = $_ary[0]; $_maxdate = $this -> maxdate + $_cstart; $_clog = count($_logfiles); if ($_clog > $_maxdate) $_clog = $_maxdate ; for ($i=$_cstart;$i<$_clog;$i++) $_fn[] = $_logfiles[$i]; } else { $_fn[] = $this->datafilename.$_datestr.$this -> datafileext; } if(ereg("l",$_mode)){ $this->view_log($_fn,$_time); } else { $this->view_ana($_fn,$_mode); } return true; } }; ?>