PHP研究

5.ファイル操作・ロック

ファイルの操作は次のようになります。

$fp = fopen ( ファイル名 , モード );
例:$fp = fopen ("count.txt","r+");

モード'r+' は上書きモード。
モード'w' はファイルを0にしてから書き込み。
モード'r' は読み込みのみ。
モード'a' は追記。

次にデータの読み込み。

fgets()
例:$count = fgets ($fp, 32);
32はバイト指定。

書き込み時はまず、ポインタを最初に戻します。

fseek() もしくは rewind()
例:fseek($fp, 0); もしくは rewind($fp);

次に書き込み。

fputs()
例:fputs($fp, $count);

ということになるようです。
そして、ファイルのクローズ。

fclose()
例:fclose($fp);


ロックには

flock()

を使います。
PHP3では

flock($fp,2);

PHP4では

flock($fp,LOCK_EX);

開放は省略できます。
開放の処理は次のようになります。

flock()
例:flock($fp, 3); もしくは flock($fp, LOOK_UN);

LOOK_EXおよび、2は排他的ロック。
LOOK_SHおよび、1は共有ロック(←?)。
LOOK_UNおよび、3はロック開放。

また互換性の問題が...........(^_^;

↓PHP3のロックの例(カウンタ)

$fp = @fopen("/tmp/counter", "r+");
// ファイルがなかった場合、ファイルを作る。
if( !$fp ) {
$fp = fopen("/tmp/counter", "w");
}

set_file_buffer($fp, 0);

flock($fp, 2);
rewind($fp);
$buf = fgets($fp, 1000000);
if( !$buf ) {
$buf = 1;
} else {
$buf++;
}
rewind($fp);
fputs($fp, $buf);
flock($fp, 3);
fclose($fp);

↓PHP4のロックの例(同じくカウンタ)

$fp = @fopen("/tmp/counter", "r+");
// ファイルがなかった場合、ファイルを作る。
if( !$fp ) {
$fp = fopen("/tmp/counter", "w");
}

set_file_buffer($fp, 0);

flock($fp, 2);
rewind($fp);
$buf = fgets($fp, 1000000);
if( !$buf ) {
$buf = 1;
} else {
$buf++;
}
rewind($fp);
fputs($fp, $buf);
flock($fp, 3);
fclose($fp);

set_file_buffer()という関数を使っていますが、
これはメモリに読み込まれたファイルの内容を0にしています。
メモリ上の内容とディスク上の内容が食い違うのを防ぐ目的のようです。

rewind()でファイルポインタを(カーソル位置みたいなもの)を、
リセットしている点に注意。