KUNISAN.JPブログ - 1164 / 1692 ページ

新規書き込み

PHP+MySQLでアクセス解析(アクセス履歴の保存)

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2010年2月12日
先日、ネットブックを自宅サーバー化(FRONTIER FRNU305 + Windows 7 Starter + XAMPP)したものの、どのように使ったらいいかアイデアがありませんでしたが、ふと「アクセス解析プログラムを設置しよう」と思いつきました。

現状のアクセス解析プログラムは、1999年にPerlで自作したものがベースとなっていて、データはテキストファイルとしてサーバー内に保存されています。しかし、データ数が2000~3000件を超えると、単純な並び替え動作でもサーバーエラーが帰ってくることがあり、仕方がないので古いデータを自動的に消去する措置を取っています。ただ、私のホームページの中にも、一日3000件(3000UV)以上アクセスのあるものがあり、そのページについては1日分を下回るデータしか保持出きないという不都合が生じています。このホームページには追加でGoogle Analyticsを利用していますが、外部のサービスだと自作の管理プログラムとの連携が取りづらいこともあり、Google Analyticsは全ホームページへの導入には至っていません。

また、最近ブログパーツなども含めて全体的にアクセス数が増えており、サーバーへの負荷が高まったせいか時折「Server Error」の表示が出てくるようにもなりました。そのため、PerlやPHPで動いている機能の一部を、どこか別のところに移動しないといけないということも思っていました。

このような経緯から、アクセス解析プログラムを自宅サーバーに新設するアイデアに至りました。せっかく自宅でMySQLが使える環境なので、使わない手はありません。現状のアクセス数からデータの大きさを計算したところ、1年間で合計2GB程度でした。ネットブックのHDD空き容量は200GBあるため、古くなったデータを廃棄するような措置を取らなくても、当面は問題ないはずです。

まずは、アクセスデータをMySQLに追加するプログラムを作成してみました。PHPのメインプログラムと、各ページに設置するコードの2本立てになっており、基本はJavaScriptで飛ばされたデータをPHPで受け取るという仕組みになっています。

問題点としては、MySQLの日本語設定がちゃんとなっていないと、phpMyAdminでの表示が文字化けしてしまうことと(PHPでデータを取り出す分には問題ありません)、Yahoo!Searchのクエリーなど、URLエンコード済みの文字列をJavaScriptでURLエンコードしてPHPでデコードすると、アドレス欄に表記されるようなURLエンコードの文字列ではなく日本語が表示されてしまうことがあります。

ただ、どちらもそんなに大きな問題ではないので、すでに一部のページでこのプログラムを稼働させています。データを解析するプログラムはこれから制作にかかりますが、面白そうなものができたらまた公開したいと思います。

※下記プログラムのご利用は自己責任でお願いします。当方はいかなるサポートも行っておりません。

■■ 1.アクセスデータをMySQLに追加 ■■■

<?php
//データベース「DB」のフィールド名一覧(括弧内はデータ型)
//0.NO(INT/auto_increment) 1.TIME(INT) 2.IP(TEXT) 3.USERAGENT(TEXT) 4.ID(TEXT) 5.UV(INT) 6.PV(INT) 7.REFERER(TEXT) 8.PAGEURL(TEXT) 9.EX1(TEXT) 10.EX2(TEXT)

$id = $_GET[ID]; //IDの取得
$referer = rawurldecode($_GET[D1]); //アクセス元取得
$pageurl = rawurldecode($_GET[D2]); //ページURL取得
//$pageurl = str_replace('www.','',$pageurl); //集計時に不具合が出る場合、ページURLのwwwは削除
$ex1 = rawurldecode($_GET[D3]); //付加データ(1)取得
$ex2 = rawurldecode($_GET[D4]); //付加データ(2)取得

//カウンタ設置ページのアドレス(指定ドメイン以外のページにJavaScriptを仕込んでカウンターを誤作動させることの無いようにするため、PHPでも直にページURLを取得する)
$pag_info = $_SERVER['HTTP_REFERER'];
$check = split('/',$pag_info);
$check_domain = str_replace('www.','',$check[2]);

//指定のドメインに設置したカウンターであれば、カウンター動作
if (($check_domain == 'XXXXXXXX.com')||($check_domain == 'XXXXXXXX.jp')) {

$time = time(); //タイムスタンプの取得
$ip = $_SERVER['REMOTE_ADDR']; //クライアントのIPアドレス取得
$useragent = $_SERVER['HTTP_USER_AGENT']; //ユーザーエージェントヘッダーの取得

//データベースと交信
//変数設定
$dbserver = 'localhost';
$dbuser = 'XXXXXXXX';
$dbpassword = 'XXXXXXXX';
$dbname = 'XXXXXXXX';

//MySQLに接続する
$con = mysql_connect($dbserver,$dbuser,$dbpassword);
if ($con) {
//print '接続完了<br>';
} else {
//print '接続失敗<br>';
}

//データベースを選択
$selectdb = mysql_select_db($dbname);
if ($selectdb) {
//print 'データベース選択完了<br>';
} else {
//print 'データベース選択失敗<br>';
}

//UVを抽出
$sql = 'SELECT max(UV) FROM DB WHERE ID = \''.$id.'\'';

//DB結果を取得
$data = mysql_query($sql);

//DB結果セットの表示
while ($sd = mysql_fetch_array ($data)) {

//PVの最大値取得
$max_uv = $sd[0];

}

//2時間以内に同じIP、USERAGENT、IDから来たアクセスか確認。
$sql = 'SELECT max(UV), IP, USERAGENT, ID, TIME FROM DB WHERE IP = \''.$ip.'\' AND USERAGENT = \''.$useragent.'\' AND ID = \''.$id.'\' AND TIME > '.($time - 7200).' LIMIT 1';

//DB結果を取得
$data = mysql_query($sql);

//DB結果セットの表示
while ($sd = mysql_fetch_array ($data)) {

//UVの現在値取得(データあれば)
$current_uv = $sd[0];

}

//2時間以内に同じアクセスがある場合にはUVを更新せず、ない場合にはUVに1追加する
if ($current_uv > 0) {
$uv = $current_uv;
} else {
$uv = $max_uv + 1;
}

//PVを抽出
$sql = 'SELECT max(PV) FROM DB WHERE ID = \''.$id.'\'';

//DB結果を取得
$data = mysql_query($sql);

//DB結果セットの表示
while ($sd = mysql_fetch_array ($data)) {

//PVの最大値取得
$max_pv = $sd[0];

}

//新しいPV
$pv = $max_pv + 1;

//テーブルにレコードを追加する
$sql = 'INSERT INTO DB
(TIME,IP,USERAGENT,ID,UV,PV,REFERER,PAGEURL,EX1,EX2)
VALUES
('.$time.',"'.$ip.'","'.$useragent.'","'.$id.'",'.$uv.','.$pv.',"'.$referer.'","'.$pageurl.'","'.$ex1.'","'.$ex2.'")';
if (mysql_query($sql)) {
//print $sd[1].'レコード追加成功<br>';
} else {
//print 'レコード追加失敗<br>';
}

//mySQLとの接続を解除
mysql_close();

}

?>

■■■■■■■■■■■■■■■■■■■■

■■■ 2.WEBページに追加するコード ■■■

<script type="text/javascript">
<!--//
ID = "TEST" //サイトID
D1 = document.referrer;
D1 = encodeURIComponent(D1);
D2 = location.href;
D2 = encodeURIComponent(D2);
D3 = "";
D3 = encodeURIComponent(D3);
D4 = "";
D4 = encodeURIComponent(D4);
document.write("<img src=\"http://kunisan.ddo.jp/counter/?ID="+ID+"&D1="+D1+"&D2="+D2+"&D3="+D3+"&D4="+D4+"\" width=\"1\" height=\"1\"><br>");
//-->
</script>

■■■■■■■■■■■■■■■■■■■■





PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

MySQL全機能バイブル ~現場で役立つAtoZ~
MySQL全機能バイブル ~現場で役立つAtoZ~ をAmazon.co.jpでチェック