PHPでアクセスカウンタを作る

(1/1)
無料のアクセスカウンタは数多くあるが、中にはアクセスログを横取りする悪質なカウンタもある。PHP が使えるなら、自分自身のサイトにカウンタを置いておきたい。
ここでは、最も基本的なカウンタ・プログラムの作り方を紹介する。

サンプル・プログラム

サンプル・プログラムの解説:準備

0009: // 初期化処理 ================================================================
0010: define('INTERNAL_ENCODING', 'UTF-8');
0011: mb_internal_encoding(INTERNAL_ENCODING);
0012: define('REFERENCE', 'http://www.pahoo.org/e-soul/webtech/php02/php02-04-01.shtm');
0013: 
0014: //プログラム・タイトル
0015: define('TITLE', 'PHPでアクセスカウンタを作る');
0016: 
0017: //カウンタを記録するファイル名;write enable属性を与えておくこと
0018: $CounterFile = './mycounter.txt';
0019: 
0020: /**
0021:  * 共通HTMLヘッダ
0022:  * @global string $HtmlHeader
0023: */
0024: $encode = INTERNAL_ENCODING;
0025: $title = TITLE;
0026: $HtmlHeader =<<< EOD
0027: <!DOCTYPE html>
0028: <html lang="ja">
0029: <head>
0030: <meta charset="{$encode}">
0031: <title>{$title}</title>
0032: <meta name="author" content="studio pahoo" />
0033: <meta name="copyright" content="studio pahoo" />
0034: <meta name="ROBOTS" content="NOINDEX,NOFOLLOW" />
0035: <meta http-equiv="pragma" content="no-cache">
0036: <meta http-equiv="cache-control" content="no-cache">
0037: </head>
0038: 
0039: EOD;
0040: 
0041: /**
0042:  * 共通HTMLフッタ
0043:  * @global string $HtmlFooter
0044: */
0045: $HtmlFooter =<<< EOD
0046: </html>
0047: 
0048: EOD;

アクセス回数はテキストファイル $CounterFile に保持しておく。

ソースコードは UTF-8 で記述しているので、念のため、組み込み関数  mb_internal_encoding  を使って宣言しておく。
プログラム・タイトルは定数 [TITLE] に、本ページの URL は定数 REFERENCE に定義しておく。これらは画面表示で参照する。

HTML ヘッダは変数 $HtmlHeader に用意しておく。
二重引用符による文字列記述は面倒なので、、ヒアドキュメントを利用する。
また、ページのキャッシングが行われてしまうとカウンタが増加したのが表示されないので、meta タグにキャッシング禁止指示 no-cache を指定している。

サンプル・プログラムの解説:カウンタの増加

0051: /**
0052:  * カウンタを+1
0053:  * @param string $fname カウンタ・ファイル名
0054:  * @return int カウンタ値
0055: */
0056: function counter_plus($fname) {
0057:     //カウンタ・ファイルがあるかどうか調べ、無ければ作成する
0058:     if (! file_exists($fname)) {
0059:         $fp = @fopen($fname, 'w');
0060:         fputs($fp, '0');
0061:         fclose($fp);
0062:         chmod($fname, 0644);
0063:     }
0064: 
0065:     //直前のカウンタ値を読み込む
0066:     $fp = @fopen($fname, 'r');
0067:     $counter = fgets($fp);
0068:     fclose($fp);
0069: 
0070:     //カウンタを+1だけ増加
0071:     $counter++;
0072: 
0073:     //カウンタ値を書き戻す
0074:     $fp = @fopen($fname, 'w');
0075:     flock($fpLOCK_EX);         //ロックをかける
0076:     $s = sprintf("%d", $counter);
0077:     fputs($fp$s);
0078:     flock($fpLOCK_UN);         //ロックを解除する
0079:     fclose($fp);
0080: 
0081:     return $counter;
0082: }

初めてプログラムを走らせたときは、$CounterFile は無い。
PHP スクリプトは、自分自身が初めて起動されたかどうかを知ることはできないので、関数  file_exists  を使い、$CounterFile が存在しているかどうか検査する。
存在していなければ、初期値 0 を代入したファイルを生成し、関数  chmod  によって所有者に書き込み権限を与える。

次に、カウンタ $CounterFile の値を 1 だけ増加させ、更新する。

更新時には、同時に複数のスクリプトが更新をかけることがないように、関数  flock  によってロックしておく。

サンプル・プログラムの解説:アクセス回数の表示

0084: /**
0085:  * HTML BODYを作成する
0086:  * @param int $counter カウンタ
0087:  * @return string HTML BODY
0088: */
0089: function makeCommonBody($counter) {
0090:     $myself = MYSELF;
0091:     $refere = REFERENCE;
0092: 
0093:     $title = TITLE;
0094:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
0095: $body =<<< EOT
0096: <body>
0097: <h2>{$title} {$version}</h2>
0098: <p>
0099: あなたは {$counter} 人目の訪問者です
0100: </p>
0101: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:400px; font-size:small;">
0102: ※参考サイト:<a href="{$refere}">{$refere}</a>
0103: </div>
0104: </body>
0105: 
0106: EOT;
0107:     return $body;
0108: }

アクセス回数の表示は、ユーザー関数 makeCommonBody で行う。

参考サイト

(この項おわり)
header