
サンプル・プログラム
サンプル・プログラムの解説:準備
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';

ソースコードは 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($fp, LOCK_EX); //ロックをかける
0083: $s = sprintf("%d", $counter);
0084: fputs($fp, $s);
0085: flock($fp, LOCK_UN); //ロックを解除する
0086: fclose($fp);
0087:
0088: return $counter;
0089: }
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: }
ここでは、最も基本的なカウンタ・プログラムの作り方を紹介する。