トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

CGIプログラミング(050519)

第3回目(2005/5/19)

 アクセス集計プログラムの作成

次のような結果を得るプログラム。

ページアクセスしたときに、日時、ユーザエージェント、IPアドレスをファイルに追記する。

 ファイルには

  • テキストファイル 英数記号日本語など
  • バイナリファイル 画像、プログラムの実行ファイルなど

 ファイルを扱う

ファイル名が必要。OSにより扱いが異なる。

  • 大文字小文字の扱い
  • パスの表記の違い
  • 利用者に対する権限の問題
  • 最初にファイルを「開く」という操作をする。
  • 用途によりモードを選択する。
  • ファイルへの操作は「ファイルハンドル」を経由して実施する。
  • ファイルに対する操作が完了したら必ずファイルを「閉じる」。
fopen();
....
fclose();

同時に複数のファイル扱うときはファイルハンドル名を異なるものにする。

ファイルに対する読み書きは行単位か文字単位かで利用する関数が異なる。今回はfwriteとfgetcsvを使う。

  • 書き込みはデータファイルの末尾へ追加
  • 読み込みはデータファイルのすべて(先頭から末尾まで)

同時に書き込みが起こらないようにファイルをロックする処理も必要


ページにアクセスしてきたクライアントの情報をファイルに書き込む保存する情報

ファイル形式はCSV形式にする。項目をダブルコーテーションで囲み、カンマ(、)で区切った形式。

"2004/11/17 12:59:31","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)","219.101.253.140"

 時刻情報

フォーマットは集計するときのことを考えて

YYYY/MM/DD HH:mm:ss

というフォーマットにする。西暦年4桁、それ以外はすべて2桁テキスト100ページの表から適切な文字列を選択する。

$jikoku = date("Y/m/d  H:i:s");

ユーザーエージェント情報

$_SERVER['HTTP_USER_AGENT']

IPアドレス情報

$_SERVER['REMOTE_ADDR']

 CSV形式のデータを作る

$csv = '"' . $jikoku . '",';
$csv = $csv . '"' . $_SERVER['HTTP_USER_AGENT'] . '",';
$csv = $csv . '"' . $_SERVER['REMOTE_ADDR'] . "\"\n";

 データファイルへの追記

データファイルをaccessinfo.datにする。

$f = fopen("accessinfo.dat", "a+");
flock($f, LOCK_EX) or exit("ロックしているの開けません");
fwrite($f, $csv);
flock($f, LOCK_UN);
fclose($f);

<?php
  $f = fopen("accessinfo.dat", "r");
  while($data = fgetcsv($f, 1000, ",")){
    echo $data[0] . "<br>";

    $th = substr($data[0], 5, 5);
    $ds[$th]++;

    $jt = substr($data[0], 12, 2);
    $js[$jt]++;

    echo $data[1] . "<br>";
    echo $data[2] . "<br>";
    echo '<hr>';
  }
  fclose($f);
?>
<TABLE border="1" cellspacing="0" cellpadding="4">
<TR><TH>月日</TH><TH>件数</TH></TR>
<?php
  foreach($ds as $k=>$v){
    echo "<TR><TD>";
    echo $k . "</TD><TD>";
    echo $v . "</TD></TR>";
  }
?>
</TABLE>
<TABLE border="1" cellspacing="0" cellpadding="4">
<TR><TH>月日</TH><TH>件数</TH></TR>
<?php
  foreach($js as $k=>$v){
    echo "<TR><TD>";
    echo $k . "</TD><TD>";
    echo $v . "</TD></TR>";
  }
?>
</TABLE> 

CGIプログラミング(H17)