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:?>
表示結果
92782
解説
今回は訪問者の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")」と言う記述はよく使うのでこれを機会に覚えておきましょう。