PHP で、連続カウント防止・カンマ区切り付きカウンタを作成する

PHP で、以下の仕様を満たすカウンタを作成してみる (このサイトで使っています)。

  1. 同一 IP からの連続したアクセスをカウントしない (連続カウント防止)。
  2. カウンタの数字をカンマ (,) で区切って表示する。

連続カウント防止機能は、

if(($ip_check == 1 && $ip != $_SERVER['REMOTE_ADDR']) ...

の部分でチェックしている。$ip には、「直前にアクセスしてきた IP アドレス」が入っている。同じ IP アドレスからアクセスし続ける限りはカウントされない。通常はこれでわりと正確なカウンタとなり得ると思うが、ファイアウォールの内側にいる同一マシンなどで、ファイアウォールのアドレスがアクセスのたびに変わる場合はこの限りではない。また、ケータイからのアクセスなどの場合も毎回アクセス元の IP アドレスがある一定の範囲内で変わるので連続カウント防止にはならないことに注意。

カウンタの数字をカンマ区切りにしているのは以下の 1行である。

$total = number_format($total); // カンマ区切りにする

以下は PHP の全ソース。

<?php // count.php // (c) 2006 twinkle.cc // https://perltips.twinkle.cc/ // updated by yas 2006/01/03 // updated by yas 2003/05/07 // updated by yas 2003/03/05 // オリジナル: https://works.xrea.jp/ // ※このスクリプトと同じディレクトリに「count.dat」という名前のファイルを作成し、置いておくこと。 if(!$file) { $file='count.dat'; } // 設定 ここから ──────────────────────────── $HOME = 'count.datがあるディレクトリのパス'; // ディレクトリ $data = "$HOME/$file"; // カウント記録ファイル $ip_check = 1; // 連続カウント防止(yes=1 no=0) // 設定 ここまで ──────────────────────────── $count = file($data); // ファイルを配列に // データ内の文字列を分解してそれぞれの変数に代入 list($total, $ip)=explode('<>', $count[0]); // カウントアップ処理 if(($ip_check == 1 && $ip != $_SERVER['REMOTE_ADDR']) || $ip_check == 0) { <pre>$total++; $new_data = implode('<>', array($total, $_SERVER['REMOTE_ADDR'])); $fp = fopen($data, 'w'); // 書きモードでオープン flock($fp, LOCK_EX); // ファイルロック fputs($fp, $new_data); // 書き込み flock($fp, LOCK_UN); // ロック解除 fclose($fp); // ファイルを閉じる } $total = number_format($total); // カンマ区切りにする print $total; // カウンタを表示 ?>

このソースを自身の PHP のカウンタを表示したいページを同じディレクトリに置き、同じディレクトリに count.dat という名前のファイルを置く (私のところは「chmod 644 count.dat」で動いているがお使いの環境によってはパーミッションに注意)。

最後に、カウンタを表示したい場所に以下のように書けばよい。

<?php include('count.php'); ?>