今回はカウンタを作ってみましょう。カウンタはページを訪れるごとに数字が増えていくという風にすればよいのです。
具体的には次のようになります。
ファイルから数字を読み込む
↓
1を足す
↓
ファイルに数字を書き込む
↓
結果の表示
ファイルを読んだり書き込んだりするにはfopen()関数を使います。
ここでfopen()関数について解説します。fopen()は、ファイルを扱うスクリプトではよく使うので覚えましょう。
詳しくはマニュアルをご覧ください(笑)
$fp = fopen ( ファイル名 , モード );
fopenは上記のように指定します。$fp にはファイルポインタが返されます。
ファイルポインタというのは、ファイルを読み書きする位置です。その位置からfputs()やfgets()関数で書き込んだり読み込んだりします。後、別に
fp じゃなくてもいいです pf でも aa でも。(ファイルポインタの略)
1番目のファイル名は "log.log" や ”./log/data.log" のように書きます。
2番目のモードは次の様になります。読み書きとポインタの位置により異なります。
'r' - [読み ポインタ先頭]....読み込みのみです。バイナリデータを全部読み込む時なんかに使います
'r+' - [読み・書き ポインタ先頭]...今回これを使います。.先頭から上書きするので前より小さいデータはごみがつきます
'w' - [書き ポインタ先頭]....もっともよく使うモードです。ファイルを空にするのでデータが飛ぶ可能性があります
'w+' -[読み・書き ポインタ先頭]....あまり使いません
'a' - [書き ポインタ終端]....ログなど、追記していくタイプはこれを使います
'a+' - [読み・書き ポインタ終端]....あまり使いません
fopen()で開いたら、fclose()関数で閉じる必要があります。
ファイルの操作を覚えたところでカウンタを作ってみましょう。ファイル名はcount.txtとします。0とだけ書いて保存してください。Linuxでは666にしておきます。ポインタというのはファイル内の位置を示します。
カウンタでは読み込んだ後に書き込むので'r+'モードでファイルを開きます。上ではゴミがつくと書きましたが、カウンタではデータは増えてく(99→100:2バイトから3バイト)ので問題ありません。
$fp = fopen
("count.txt","r+");
次に前回のカウント数を読み込みます。読み込みにはfgets()を使います。
$count = fgets ($fp, 32);
これは32バイトまで読み込むという事ですが、その前に改行やEOFがあればそこまでです。特に32バイトの意味はないです。
次に1増やすには、$count = $count + 1; と書けばいいですが、次のように書けます。
$count++;
詳しくはマニュアル第9章
式 を見てください。後置加算と言います
次に書き込むのですが、fgetsで読み込んだ時にポインタが動いてファイルの最後に行っているので、ポインタを先頭に引き戻してから、書き込みます。ポインタを戻すのはfseek()
書き込みはfputs()です。追記:rewind($fp)の方がいいかも...
fseek($fp, 0);
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桁にそろえて表示 ?>
結果
宿題? ヒント?
$logfile="tt4";include("short.php");?> |