4.カウンタを作ろう〜ファイル操作
処理の流れ

今回はカウンタを作ってみましょう。カウンタはページを訪れるごとに数字が増えていくという風にすればよいのです。
具体的には次のようになります。

ファイルから数字を読み込む
      ↓
    1を足す
      ↓
ファイルに数字を書き込む
      ↓
   結果の表示

ファイルを読んだり書き込んだりするにはfopen()関数を使います。

ファイル操作

ここでfopen()関数について解説します。fopen()は、ファイルを扱うスクリプトではよく使うので覚えましょう。
詳しくはマニュアルをご覧ください(笑)

$fp = fopen ( ファイル名 , モード );

fopenは上記のように指定します。$fp にはファイルポインタが返されます。
ファイルポインタというのは、ファイルを読み書きする位置です。その位置からfputs()やfgets()関数で書き込んだり読み込んだりします。後、別に fp じゃなくてもいいです pf でも aa でも。(ファイルポインタの略)

1番目のファイル名は "log.log" や ”./log/data.log" のように書きます。

2番目のモードは次の様になります。読み書きとポインタの位置により異なります。

fopen()で開いたら、fclose()関数で閉じる必要があります。

では、早速!

ファイルの操作を覚えたところでカウンタを作ってみましょう。ファイル名はcount.txtとします。0とだけ書いて保存してください。Linuxでは666にしておきます。ポインタというのはファイル内の位置を示します。

カウンタでは読み込んだ後に書き込むので'r+'モードでファイルを開きます。上ではゴミがつくと書きましたが、カウンタではデータは増えてく(99→100:2バイトから3バイト)ので問題ありません。

$fp fopen ("count.txt","r+");

次に前回のカウント数を読み込みます。読み込みにはfgets()を使います。

$count fgets ($fp32);

これは32バイトまで読み込むという事ですが、その前に改行やEOFがあればそこまでです。特に32バイトの意味はないです。
次に1増やすには、$count = $count + 1; と書けばいいですが、次のように書けます。

$count++;

詳しくはマニュアル第9章 式 を見てください。後置加算と言います
次に書き込むのですが、fgetsで読み込んだ時にポインタが動いてファイルの最後に行っているので、ポインタを先頭に引き戻してから、書き込みます。ポインタを戻すのはfseek() 書き込みはfputs()です。追記:rewind($fp)の方がいいかも...

fseek($fp0);
fputs($fp$count);

最後にファイルを閉じて結果を表示します

fclose($fp);
echo $count

一応完成なのですが、ファイルのロックを加えておきましょう。ロックというのは自分が書き込もうとしている時に割り込んできて書き込もうとする奴が現れて、ファイルが壊れてしまうのを防ぐ為にかぎを掛けることです。
書き込みのロックです。ロックの開放は省略します。

flock($fp,2); /* PHP4.0.1以降は2をLOCK_EXとします */

ついでにカウンタの桁数を0で補うようにすることにします。sprintfでフォーマットします。
例は5桁です。

$count sprintf("%05d"$count);

まとめると次のようになります

<?php
$fp = fopen("count.txt","r+");	// 読み書きモードでオープン
flock($fp, LOCK_EX);		// 書き込みロック
$count = fgets($fp, 32);	// 32バイトorEOFまで取得
$count++;			// カウントアップ
fseek($fp, 0);		// ポインタを先頭に戻す
fputs($fp, $count);		// 書き込み
fclose($fp);		// ファイルを閉じる
printf("%05d", $count);	// 5桁にそろえて表示
?>

結果 

応用編〜IP重複をカウントしない

宿題?    ヒント?





<<Prev  Next>>


LastModified