アクセスカウンタ

アクセスカウンタでホームページ訪問者の数を数えましょう。

訪問者が多いホームページは、人気ホームページといえるでしょう。 アクセスカウンタをホームページにつけると、訪問者数を知ることができます。 シンプルなテキスト型アクセスカウンタを実際に作ってみましょう。

ファイルの読み書き

アクセスカウンタを作るには、今までのアクセス数を覚えておかないといけませんね。 そのため、アクセス数を記録しておくファイルを作成します。 html ファイルとは別のファイルになるので注意しましょう。

ファイルの読み込みは、関数 fopen を使用します。

  $access_file = 'count.txt' ;
  $file_pointer = fopen($access_file, "r+");  

ここでは、ファイルからアクセス数を読み込み、新しいアクセス数を書き込むので、 ファイルを読み書き可能モードr+ で開くようにしています。 その他のモードは以下の通りです。

ファイルポインタの位置は、開くファイルのどこから読み込み、書き込みを始めるか、 を指定します。 ファイルに書き込みする場合には注意しましょう。 今のファイルに上書きする場合はwまたはw+を使います。 今のファイルの末尾に付け加える場合はaまたはa+を使います。

fopen のモード
コード モード ファイルポインタ
r 読み込み専用モード 先頭
r+ 読み込み、書き込みモード 先頭
w 書き込み専用モード
元のファイル内容は削除される
先頭
w+ 読み込み、書き込みモード
元のファイル内容は削除される
先頭
a 書き込み専用モード 終端
a+ 読み込み、書き込みモード 終端

※注意※ サーバのアクセスモードを正しく設定しておく必要があります。 例えば、サーバでファイルを書き込み不可に設定していると、 書き込みモードでオープンしても、書き込みできません。

ファイルのデータを変数に取り込む

fopen はファイルを開く操作を行ってくれました。 次は、そのファイルからデータ(の一部)を取り出すことをしましょう。 関数 fgets を利用して、ファイルに保存されているカウンタの数値を $count という変数に格納します。 (fopenfgets を用いるのは無駄のように思えるかもしれません。 単純なアクセスカウンタの場合には、わざわざ二度に分けて行う必要はないのですが、 汎用性の観点から、こちらのやり方を紹介しています。)

  $count =fgets($file_pointer);
  $count++;
  rewind($file_pointer);  

関数 fgets を利用すると、ポインタの位置が移動します。 ビデオテープを再生すると、その分だけテープが巻き取られるようなものです。 後で同じ場所に新しいアクセス数を書き込むため、 関数 rewind を用いて、元の位置に戻しておきましょう。

ここでは指定していませんが、関数 fgets は、 読み込むデータの長さを指定することができます。 長さを指定する場合は、fgets(ファイル名, 長さ) というふうに指定します。 下の例では、$file_pointer の半角 10 文字分を読み込みます。

  $count =fgets($file_pointer, 10);  

ファイルの排他ロック

ホームページは、1人ずつ順番に訪問するとは限らず、 同時に数人がアクセスすることもありますね。 HTML ファイルは読み込みだけですが、カウンタファイルは、書き込みも行います。 同時に書き込みを行うと、正しくカウントされません。 また、最悪の場合エラーになります。

一度に複数の書き込みができないようにするには、 排他ロックを利用します。 OS の機能にファイルの排他ロック機能があるので、 PHP でもそれを利用します。 排他ロックには、関数 flock を用います。 ロックするときには、LOCK_EX オプションを付け、 ロックを解除するときには、LOCK_UN オプションを付けます。

  flock($file_pointer, LOCK_EX) or exit("Cannot lock on $access_file");
  fwrite($file_pointer, $count);
  flock($file_pointer, LOCK_UN);
  fclose($file_pointer);  

既にロックされているときには、 exit 命令を使って、書き込み作業を中止するようにします。

カウンタの値を表示する

カウンタの数値が1増えたので、これを表示させましょう。 新しいカウンタの値が表示されることに注意しましょう。

  echo $count;  
Copyright (C) 2003-2018. PHP で WEB 作成 All rights reserved.