PHP 実験室 第二回目 IP アドレス記録型カウンター

記述ソース

01:<?php
02:$file = @fopen("log2.cgi","r+") or die("ファイルの読み込み失敗");
03:flock($file, LOCK_EX);
04:$cnt     = fgets($file);
05:$cnt     = chop($cnt);
06:$ip_add1 = fgets($file,256);
07:$ip_add2 = fgets($file,256);
08:$ip_add3 = fgets($file,256);
09:$ip_add1 = chop($ip_add1);
10:$ip_add2 = chop($ip_add2);
11:$ip_add3 = chop($ip_add3);
12:$new_ip  = getenv("REMOTE_ADDR");
13:
14:if($ip_add1 != $new_ip && $ip_add2 != $new_ip && $ip_add3 != $new_ip)$cnt++;
15:
16:ftruncate($file,0);
17:rewind($file);
18:fwrite($file, $cnt);
19:fwrite($file, "\n");
20:fwrite($file, $new_ip);
21:fwrite($file, "\n");
22:fwrite($file, "$ip_add1");
23:fwrite($file, "\n");
24:fwrite($file, "$ip_add2"); 
25:flock($file, LOCK_UN);
26:fclose($file);
27:echo $cnt;
28:?>

表示結果

73794

解説

今回は訪問者のIP アドレスを3個記憶するカウンターを作成しました。前回作成したカウンターは、同じ人がページの更新をかける度に数字がプラス1されていました。今回はそれを避けるために、訪問者のIP アドレスを最新のものから3個記録しておき、新しい訪問者のIP アドレスがその3個のうちのいずれかとマッチしたらカウントしない仕組みになっています。今回用意するログファイルは下記の通り。

訪問者数
1番新しい訪問者のIPアドレス
2番目に新しい訪問者のIPアドレス
3番目に新しい訪問者のIPアドレス

細かい内容は以下で説明します。

【02】でファイルを読み込み【03】で排他制御をかけるのは前回と同様です。【04】のように「fgets」を使用して引数に指定されたファイルポインタから1行読み込みます。ただ、今回1行目に書かれていますのは「数字+改行マーク」ですので、「chop」関数を使い末尾の改行マークを取り除いておきます。同じように2行目、3行目、4行目についてもそれぞれ代入→改行マーク除去作業を【06】〜【11】で行っています。

次に【12】で環境変数から訪問者のIP アドレスを取得しています。「getenv("REMOTE_ADDR")」と言う記述はよく使うのでこれを機会に覚えておきましょう。