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 "$v | ";
}
print "
\n";
}
foreach($_array as $_key => $_val) {
if($_min > 0){
if($_val < $_min) break;
}
//-----
if(is_array($_val)){
$_key = "$_key | ";
arsort($_val);
foreach($_val as $_key2 => $_val2){
print "$_key$_key2 | $_val2 |
\n";
$_key = "";
}
} else {
print "$_key | $_val |
\n";
}
}
print "
\n";
}
}
function template_hour($_array = "") {
if ($_array != "") {
print "";
print "";
foreach($this->timetable as $k){
print "$k | ";
}
print "計 |
\n";
$psum=0; $pmax=0;
print "";
foreach($this->timetable as $k){
if($_array[$k]=="")$v=0;else $v=$_array[$k];
print "$v | ";
$psum+=$v;
if($v>$pmax)$pmax=$v;
}
print "$psum |
\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 "bgcolor_tr}>$s | ";
}
}
print "bgcolor_tr}>☆ ☆ ☆ ☆ ☆
|
\n";
print "
";
}
}
/* 日毎表示 日付縦バージョン */
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 | $k |
";
++$i;
}
print "\n";
print "
\n";
print "";
print "日付 | ";
//foreach($p as $k=>$v) print "$k | ";
for($i=0;$i$i";
print "総計 |
\n";
unset($p2sum);
foreach($d as $dt){
$dsum = 0;
$d2sum = 0;
print "".substr($dt,4,2)."/".substr($dt,6,2)." | ";
foreach($p as $pname => $psum){
$p2sum[$pname] += $_array2[$dt][$pname];
$dsum += $_array[$dt][$pname];
$d2sum += $_array2[$dt][$pname];
print ''.$_array[$dt][$pname].'('.$_array2[$dt][$pname].') | ';
}
print "$dsum($d2sum) | ";
}
print "
\n";
print "総計 | ";
foreach($p as $k=>$v){
$ppsum +=$v;
$pp2sum +=$p2sum[$k];
print "$v({$p2sum[$k]}) | ";
}
print "$ppsum($pp2sum) | ";
print "
\n";
print "
\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 "".substr($v,4,2)."/".substr($v,6,2)." | ";
print "計 |
\n";
arsort($p);
foreach($p as $pname => $psum){
print "$pname | ";
$p2sum = 0;
foreach($d as $dt){
$p2sum += $_array2[$dt][$pname];
$dsum[$dt] += $_array[$dt][$pname];
$d2sum[$dt] += $_array2[$dt][$pname];
print ''.$_array[$dt][$pname].'('.$_array2[$dt][$pname].') | ';
}
print "$psum($p2sum) | ";
}
print "
\n";
print "総計 | ";
foreach($dsum as $k=>$v){
$ddsum +=$v;
$dd2sum +=$d2sum[$k];
print "$v({$d2sum[$k]}) | ";
}
print "$ddsum($dd2sum) | ";
print "
\n";
print "
\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;
}
};
?>