カウンターを回す際の恐怖のログ飛び

そふぃのphp入門ファイルロックの必要性ファイルのロックを参考に調べてみました。

そふぃのphp入門によると、ログが飛ぶ際には下記のような現象が起きるそうです。

Aさんがファイルを開く
Aさんが読み込む値は「100」
Aさんのカウント値+1
ここでBさんが颯爽と登場してファイルを開く
「101」を書き込むつもりのAさんはファイルの中身を消去して・・かきこ・・・・・・む前に・・
Bさんのカウント値はそんな事ともつゆ知らず「なし」と認識される
カウント値には何の疑問も持たれる事なくAさんの101が書き込まれる
Bさんのカウント値+1・・・・って値がないな・・・・仕方ない、やっぱ値は「なし」と
Aさんはファイルを閉じてさよ~~なら
Bさんは颯爽と「なし」・・・とは書くわけはないので何も書き込まない
Bさんも何の疑問も持たずにファイルを閉じてさようなら

そのため、下記のような処理が必要になるとのこと。

ファイルを上書きモード「r+」で開く(r+は読み書き両方可能です)
排他ロックをかける
(これでカウント値も残ったまま、誰も触れなくなりました)
誰も触れなくなったところで、安心してカウント値を読み込む
カウント値を+1
ファイルポインタをちゃんと先頭に戻す
新しいカウント値を書き込む
(前のカウント値は上書きされるので自然に消滅)
ファイルロックを破棄する
ファイルを閉じる

上記の処理をコードで書くと、下記のようになるとのこと。

<?php
$filepath = ‘counter/count.txt’; // ファイルへのパスを代入しておく
$fp = @fopen( $filepath, “r+” ); // ファイル開く 今回はr+が望ましいと思う
@flock($fp,LOCK_EX); // 排他ロックをかける
$count = fgets( $fp, 10 ); // 9桁分値読み取り
$count++; // カウントアップ
rewind( $fp ); // ファイルポインタを先頭に戻す
fputs( $fp, $count ); // 値書き込み
flock($fp,LOCK_UN); // ロックの破棄。この位置なら書かなくてもいいがまぁ一応・・
fclose( $fp ); // ファイル閉じる
echo $count; // カウント値出力
?>

難しい。。

>お仕事中の気分転換にこちらもどうぞ。

9月 1, 2011 | No Comments

おばけノートについて

Comments *click to open.

Leave a Reply