ポンクソフト

アクセス解析4 - PHPでアクセスカウンタ&解析

前ページ PHPでアクセスカウンタ&解析 TOP 

目次

  1. PHPでアクセスカウンタ&解析
  2. テキストカウンタ
  3. 画像カウンタ
  4. アクセス解析1
  5. アクセス解析2
  6. アクセス解析3
  7. アクセス解析4

アクセス解析4

ユーザーエージェント・リファラ・ホスト名のそれぞれアクセスの多い順に5つ表示します。

ページの作成

まずカウンタを表示するページを作成します。page1.php を開き
あなたは<?php require "counter1.php" ?>人目のお客様です。
の部分を
あなたは<?php require "counter6.php" ?>人目のお客様です。
に書き換えて「page6.php」という名前でサーバにアップしてください。

カウンタプログラムの作成

次にアクセスカウンタのプログラムを作成します。以下のソースを入力してください。
<?php
// アクセスカウンタ6

if ($_GET['log'] == 'yes') {
  print "<html><body>\n";
  $logs = file("log2.txt");
  $agents = array();
  $referers = array();
  $hosts = array();
  foreach ($logs as $l) {
    $l = rtrim($l);
    list($agent, $referer, $host) = explode("\t", $l);
    if ($agent) array_push($agents, $agent);
    if ($referer) array_push($referers, $referer);
    if ($host) array_push($hosts, $host);
  }
  print_graph($agents, 'ユーザーエージェント', 'blue');
  print_graph($referers, 'リファラ', 'green');
  print_graph($hosts, 'ホスト(IP)', 'red');
  print "</body></html>\n";
  exit();
}

$fp = @fopen("counter6.txt", "r+") or die("Counter Error");
flock($fp, LOCK_EX);
$count = fgets($fp);
$count++;
rewind($fp);
fputs($fp, $count);
fclose($fp);

$log = $_SERVER['HTTP_USER_AGENT'] . "\t";
$log .= $_SERVER['HTTP_REFERER'] . "\t";
$log .= @gethostbyaddr($_SERVER['REMOTE_ADDR']) . "\n";
$fp = @fopen("log2.txt", "a") or die("Log Error");
flock($fp, LOCK_EX);
fputs($fp, $log);
fclose($fp);

print "<a href='counter6.php?log=yes'>$count</a>";

function print_graph($datas, $title, $color) {
  $ranks = array_count_values($datas);
  arsort($ranks);
  print "$title TOP5\n";
  print "<table border='1'>\n";
  $rnum = 1;
  foreach ($ranks as $k => $v) {
    $w = $v * 10;
    print "<tr>";
    print "<td nowrap>$k</td>";
    print "<td nowrap><table><tr>";
    print "<td nowrap width='$w' bgcolor='$color'> </td>";
    print "<td nowrap>$v 件</td>";
    print "</tr></table></td>";
    print "</tr>\n";
    $rnum++;
    if ($rnum > 5) break;
  }
  print "</table>\n";
}
?>
入力が終わったら「counter6.php」という名前でサーバにアップします。

カウンタファイルの作成

次に前回と同じくアクセスカウントを保存するためのファイルを作成します。新規テキストファイルを作成し
0
とだけ記述して(改行は入れない)、「counter6.txt」という名前でサーバにアップします。その後、FTPソフトの「属性変更」から「その他」に書込許可属性を与えます。

ログファイルの作成

次にアクセス解析の結果を保存するためのログファイルを、前回とはフォーマットが変わったので新しく作成します。新規テキストファイルを作成し何も書かずに「log2.txt」という名前でサーバにアップします。その後、FTPソフトの「属性変更」から「その他」に書込許可属性を与えます。

実行

以上の用意ができたら、page6.php をブラウザでアクセスしてみてください。カウンタのリンクをクリックすると、アクセス解析の結果が表示されます。

counter6.php ソースの解説

$logs = file("log2.txt");
ログファイル log2.txt の内容を一行ずつ配列 $logs に格納します。
  $agents = array();
  $referers = array();
  $hosts = array();
配列 $agents, $referers, $hosts を定義しています。この配列にはそれぞれ、ユーザーエージェント、リファラ、ホスト名(IPアドレス)が入ります。
foreach ($logs as $l) {
配列 $logs から一行ずつ取り出して $l に代入しつつループします。
    $l = rtrim($l);
    list($agent, $referer, $host) = explode("\t", $l);
    if ($agent) array_push($agents, $agent);
    if ($referer) array_push($referers, $referer);
    if ($host) array_push($hosts, $host);
ログ一行のデータから、まず終端の改行を除き、タブ区切りによって項目を分けます。次にそれぞれの項目が空でなければそれぞれ別個の配列に保存して行きます。
  print_graph($agents, 'ユーザーエージェント', 'blue');
  print_graph($referers, 'リファラ', 'green');
  print_graph($hosts, 'ホスト(IP)', 'red');
グラフを表示する関数 print_graph にデータの入った配列・タイトル・グラフの色を渡し、グラフを表示します。
$fp = @fopen("counter6.txt", "r+") or die("Counter Error");
flock($fp, LOCK_EX);
$count = fgets($fp);
$count++;
rewind($fp);
fputs($fp, $count);
fclose($fp);
カウンタをインクリメントしている部分です。前回と同じです。
$log = $_SERVER['HTTP_USER_AGENT'] . "\t";
$log .= $_SERVER['HTTP_REFERER'] . "\t";
$log .= @gethostbyaddr($_SERVER['REMOTE_ADDR']) . "\n";
ログ保存用に環境変数を取得します。$_SERVER['HTTP_USER_AGENT'] でユーザーエージェント、$_SERVER['HTTP_REFERER'] でリファラ、$_SERVER['REMOTE_ADDR'] で IP アドレスを取得できます。gethostbyaddr 関数は、IP アドレスからホスト名に変換します。変換できなければ IP アドレスをそのまま返します。
function print_graph($datas, $title, $color) {
グラフを表示する関数です。第1引数はデータの入った配列、第2引数はグラフのタイトル、第3引数はグラフの色です。
  $ranks = array_count_values($datas);
  arsort($ranks);
データの出現回数を数えた配列を、値の降順でソートし、出現回数の多い順に並び替えています。
print "$title TOP5\n";
タイトルを表示します。
$rnum = 1;
$rnum には現在表示している順位が入ります。
  foreach ($ranks as $k => $v) {
    $w = $v * 10;
    print "<tr>";
    print "<td nowrap>$k</td>";
    print "<td nowrap><table><tr>";
    print "<td nowrap width='$w' bgcolor='$color'> </td>";
    print "<td nowrap>$v 件</td>";
    print "</tr></table></td>";
    print "</tr>\n";
    $rnum++;
    if ($rnum > 5) break;
  }
各日付のアクセス数を棒グラフにして出力している部分です。
$w は棒グラフの長さ(ピクセル数)です。出現回数×10に設定しています。棒グラフはテーブルのセルの長さ (td width) を指定して背景色 (td bgcolor) を変えて表現しています。テーブルの中にさらにテーブルを作り棒グラフを描画しています。最後に順位を5位まで表示したらループを抜けます。
前ページ PHPでアクセスカウンタ&解析 TOP 
このエントリーをはてなブックマークに追加 そっか0

このページに関するコメントをどうぞ

お名前:


wentgt
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/25 00:08

初心者
メールソフトの設定ってどうやるのですか...
gmailに送りたいのですが...
2017/01/24 21:33

enveloptf
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/24 21:23

paywinlv
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/24 18:04

anklebitcw
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/24 11:35

butterfxa
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/24 03:37

nhadeptronmr
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/23 20:39

nhadeptronlv
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/23 15:24

sinforve
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/23 12:46

calltrackju
すべての
cbbnews24.com
csgobooms.com
csgojoybets.com
incareersjobs.com
stcmidtenn.org
thewill.in
sakirkaratas.com
apexturnkey.in
medray.in
applevalleymarket.com
b8b90.com
danhhotgay.com
cstopstake.com
nsm.org.in
vov-fc.com
csgohugepots.com
eaglesapparelshop.com
mymobileappmobiappssub2016.com
sbppl.org
gracedental.in
kehulin.com
cheappricetoyou2015.com
vamortgageloantexas.com
doitacdoanhnghiep.com
techimanage.com
elmi.co
upea.in
esncordoba.org
goal888cash.com
fullebookz.com
2winde222.com
投稿者
2017/01/23 09:37

残りを読む »