Tips

2014.09.29

PHP カウンタ―の作成 【応用編 第1回】

PHP

カウンター

今回PHPでのカウンターの作成の仕方について記述したいと思います。

ファイルにアクセス数を保存する

WEBページにアクセスしに来たユーザの数などをカウントするプログラムです。

アクセスしに来た数を保存しないといけないので、ファイルに保存をしておきます。

基本的なカウンタ

基本的なカウンタは以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
 
  //カウンタを保存するファイル名を定義
  $file_name = 'count.log';
 
  //ファイルが存在するかどうか
  if(!file_exists($file_name)){
    //存在していない場合はファイルを作成する
    touch($file_name);
  }
 
  //ファイルのポインタを作成
  $file_pointer = fopen($file_name, 'r+');
 
  //ファイルを排他ロックする
  if(flock($file_pointer, LOCK_EX)){
    //ファイルを20byteまで読み込む
    $count_var = fread($file_pointer, 20);
    //カウンタの値を1増やす
    $count_var = $count_var + 1;
    //ファイルの読み込み位置をファイルの先頭まで戻す
    rewind($file_pointer);
    //ファイルにカウンタの値を書き込む
    fwrite($file_pointer, $count_var);
  }
 
  //ファイルの排他ロックに失敗した場合
  else {
    echo "ファイルのロックに失敗しました。";
  }
 
  echo "このページに対して".$count_var."回目のアクセスです";
 
  //ファイルポインタの解放
  fclose($file_pointer);
 
?>

fopenを使用してアクセス数を保存するファイルをポインタに格納し、

freadでそのファイルの先頭から20byte目までを読み込んでいます。

ファイルを読み込むと次にファイルを読み書きする位置が読み込んだ文字の後ろになってしまうので、

fwriteで書き込みをする前に読み書き位置(シーク)を先頭に戻す必要があります。

その後 fcloseでファイルポインタを解放します。

もっと短いカウンターの例

以下のようにするともっと短くカウンタを作成できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
  //カウンタを保存するファイル名を定義
  $file_name = './count.log';
 
  //ファイルが存在するかどうか
  if(!file_exists($file_name)){
    //存在していない場合はファイルを作成する
    touch($file_name);
  }
 
  //ファイルの中身を $val 配列に格納する
  $val = file($file_name);
 
  //アクセスカウンタを1増やす( $val[0] ではファイルの1行目に対してということになる)
  $count_val = $val[0] + 1;
 
  //ファイルにアクセスカウンタを書き込む
  file_put_contents($file_name, $count_val);
 
  echo "このページに対して".$count_val."回目のアクセスです";
 
?>

PHPにあらかじめ用意されているfile関数を使用すると fopen や fread を使わなくても

ファイルの中身を配列に格納することができます。

配列に格納する際には(上記の場合は $val)

$val[0] ファイルの1行目
$val[1] ファイルの2行目
$val[2] ファイルの3行目

といった感じで格納されていくので、1行目を取り出すだけなら $val[0] で取り出すことができます。

また file_put_contents を使用すると fopen, fwrite などを使用せずに、

ファイルに対してデータを書き込むことができます。

ただし file_put_contents は PHP 5.2.5 以前では

内部でファイルのロックがうまくを行われないようなので

file_put_contents 使用する場合は PHP 5.2.6 以降のほうがよさそうです。

新連載はじまりました!新PHP基礎 連載リンク

PHP基礎 連載

Recent News

Recent Tips

Tag Search