「アクセス解析を作る」


自分でアクセス解析を作ってみたいと思っています。ページごとのアクセス数を見るだけなら既存のサービスでいいのですが、「データを加工して再利用」したいのです。

利用例)
・ページごとのアクセスランキングを算出
・アクセス数によってページのデザインを変更
これはあくまで一例です。

できれば自作したくありません。既存のサービスにカウントはさせて、そのログを自作スクリプトで解析して再利用・・という流れがベストです。

しかしアクセス解析の仕組みがわかっていませんので、そのような事ができるのかどうかわかりません。ちなみにPHPとMySQLしかできません。

漠然とした質問ですが、取っ掛かりとなるような情報を求めています。

みなさんよろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2007/05/08 18:48:49
  • 終了:2007/05/09 18:00:06

ベストアンサー

id:V-C No.1

V-C回答回数22ベストアンサー獲得回数22007/05/08 19:28:02

ポイント80pt

某アクセス解析スクリプトを改造して、私のサイトで使っているアクセスログの収集スクリプトです。

<?php
class get_log{
function get_log(){
// 時刻($hour,$now)
$now = date("H:i:s");
$hour = date("H");

// ホスト名($host)
$addr = $_SERVER["REMOTE_ADDR"];
$host = $_SERVER["REMOTE_HOST"];
if ($host == $addr || $host == '') { $host = $addr;}
$host = strtolower($host);

// リファラ($ref)
$ref = $_SERVER["HTTP_REFERER"];
$ref = ereg_replace("%7E","~",$ref);
$ref = ereg_replace(",","%2C",$ref);
if(ereg("colordic",$ref)){$ref = "";}

// アクセス先($acc)
$acc = $_SERVER["REQUEST_URI"];
$acc = ereg_replace("%7E","~",$acc);
if (ereg("file:",$acc)) { $acc = ""; }

// ブラウザ名($hua)
$agnt = $_SERVER["HTTP_USER_AGENT"] ;
$agnt = ereg_replace("<","&lt;",$agnt);
$agnt = ereg_replace(">","&gt;",$agnt);
list($hua,$hua1,$hua2,$hua3) = split('/',$agnt);
if  (ereg("MSIE",$hua1)) {
list($dummy,$ver) = split("MSIE",$hua1);
list($ver,$dummy) = split("\;",$ver);
$hua ="Internet Explore $ver";
}
elseif (ereg("Gecko",$hua1)) {
list($dummy,$hua2) = split(" ",$hua2);
list($ver,$dummy) = split("\(",$hua3);
$hua ="$hua2 $ver";
}
elseif (ereg("Opera",$hua)) {
list($ver,$dummy) = split(" ",$hua1);
$hua ="$hua $ver";
}
else {
list($ver,$dummy) = split(" ",$hua1);
$hua = "$hua $ver";
}

// OS($os)
if(ereg("Win(.*)(95|98|NT)",$agnt,$os)){$os=$os[2];  $os = "Windows $os";}
elseif(ereg("Mac|PPC",$agnt,$os)){ $os = "Macintosh"; }
elseif(ereg("Linux|SunOS|X11|BSD",$agnt,$os)){ $os = "UNIX"; }
else {$os = ""; }
$this->logdata = "$hour,$ref,$acc,$host,$hua,$now,$os";
}

function save_log(){
$dir = $_SERVER["DOCUMENT_ROOT"]."/log/";
$log = $dir.date("Ymd").".csv";
if (!$fp = fopen($log,"a")){ echo "LOG_OPEN_ERROR";}
flock($fp,LOCK_EX);
fwrite($fp,"$this->logdata\n");
flock($fp,LOCK_UN);
fclose($fp);
chmod($log,0666);
}
}//class_end
?>

参考になれば。

id:tokyosmash

ご丁寧にありがとうございます。

これは大変参考になります。


試しに使ってみたいのですが、こちらのスクリプトをrequre_onceで呼び出せば

/log/~~.csv

に記録されるという事なのでしょうか?

スクリプト最後のsave_log()以下がちょっとよくわかりません。もしよろしければご教授ください。

2007/05/08 21:10:23

その他の回答(1件)

id:V-C No.1

V-C回答回数22ベストアンサー獲得回数22007/05/08 19:28:02ここでベストアンサー

ポイント80pt

某アクセス解析スクリプトを改造して、私のサイトで使っているアクセスログの収集スクリプトです。

<?php
class get_log{
function get_log(){
// 時刻($hour,$now)
$now = date("H:i:s");
$hour = date("H");

// ホスト名($host)
$addr = $_SERVER["REMOTE_ADDR"];
$host = $_SERVER["REMOTE_HOST"];
if ($host == $addr || $host == '') { $host = $addr;}
$host = strtolower($host);

// リファラ($ref)
$ref = $_SERVER["HTTP_REFERER"];
$ref = ereg_replace("%7E","~",$ref);
$ref = ereg_replace(",","%2C",$ref);
if(ereg("colordic",$ref)){$ref = "";}

// アクセス先($acc)
$acc = $_SERVER["REQUEST_URI"];
$acc = ereg_replace("%7E","~",$acc);
if (ereg("file:",$acc)) { $acc = ""; }

// ブラウザ名($hua)
$agnt = $_SERVER["HTTP_USER_AGENT"] ;
$agnt = ereg_replace("<","&lt;",$agnt);
$agnt = ereg_replace(">","&gt;",$agnt);
list($hua,$hua1,$hua2,$hua3) = split('/',$agnt);
if  (ereg("MSIE",$hua1)) {
list($dummy,$ver) = split("MSIE",$hua1);
list($ver,$dummy) = split("\;",$ver);
$hua ="Internet Explore $ver";
}
elseif (ereg("Gecko",$hua1)) {
list($dummy,$hua2) = split(" ",$hua2);
list($ver,$dummy) = split("\(",$hua3);
$hua ="$hua2 $ver";
}
elseif (ereg("Opera",$hua)) {
list($ver,$dummy) = split(" ",$hua1);
$hua ="$hua $ver";
}
else {
list($ver,$dummy) = split(" ",$hua1);
$hua = "$hua $ver";
}

// OS($os)
if(ereg("Win(.*)(95|98|NT)",$agnt,$os)){$os=$os[2];  $os = "Windows $os";}
elseif(ereg("Mac|PPC",$agnt,$os)){ $os = "Macintosh"; }
elseif(ereg("Linux|SunOS|X11|BSD",$agnt,$os)){ $os = "UNIX"; }
else {$os = ""; }
$this->logdata = "$hour,$ref,$acc,$host,$hua,$now,$os";
}

function save_log(){
$dir = $_SERVER["DOCUMENT_ROOT"]."/log/";
$log = $dir.date("Ymd").".csv";
if (!$fp = fopen($log,"a")){ echo "LOG_OPEN_ERROR";}
flock($fp,LOCK_EX);
fwrite($fp,"$this->logdata\n");
flock($fp,LOCK_UN);
fclose($fp);
chmod($log,0666);
}
}//class_end
?>

参考になれば。

id:tokyosmash

ご丁寧にありがとうございます。

これは大変参考になります。


試しに使ってみたいのですが、こちらのスクリプトをrequre_onceで呼び出せば

/log/~~.csv

に記録されるという事なのでしょうか?

スクリプト最後のsave_log()以下がちょっとよくわかりません。もしよろしければご教授ください。

2007/05/08 21:10:23
id:V-C No.2

V-C回答回数22ベストアンサー獲得回数22007/05/09 05:42:12

ポイント80pt
$dir = $_SERVER["DOCUMENT_ROOT"]."/log/";
$log = $dir.date("Ymd").".csv";

ログを保存するディレクトリを/log/にし、保存するファイル名を年月日.csv(ex.070509.csv)のようなフォーマットに設定。

if (!$fp = fopen($log,"a")){ echo "LOG_OPEN_ERROR";}
flock($fp,LOCK_EX);
fwrite($fp,"$this->logdata\n");
flock($fp,LOCK_UN);
fclose($fp);
chmod($log,0666);

この部分はファイル保存でよく使われるスクリプトです。ファイルを作成し、書き込みをし、パーミッションの設定をしています。

includeして

$obj = new get_log();
$obj->save_log();

でログを記録するはずです。

id:tokyosmash

ありがとうございます。

無事にログ収集することが出来るようになりました。

今度はログの解析ですね。

新しく質問していますので、もしよろしければまたアドバイス下さい。

今回の質問は非常に勉強になりました。やはり具体的にスクリプトを頂けると勉強の効率がいいです。ご丁寧にありがとうございました!

2007/05/09 17:59:03

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません