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

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

サンプル・プログラム

目次

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

0011: define('INTERNAL_ENCODING', 'UTF-8');
0012: mb_internal_encoding(INTERNAL_ENCODING);
0013: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/php02/php02-04-01.shtm');
0014: 
0015: //プログラム・タイトル
0016: define('TITLE', 'PHPでアクセスカウンタを作る');
0017: 
0018: //表示幅(ピクセル)
0019: define('WIDTH', 600);
0020: 
0021: //カウンタを記録するファイル名;write enable属性を与えておくこと
0022: $CounterFile = './mycounter.txt';

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

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

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

解説:カウンタの増加

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

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

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

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

解説:アクセス回数の表示

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

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

参考サイト

(この項おわり)
header