[PHP-users 10960] Re: Flockについて

WADA Masashi php-users@php.gr.jp
2002年10月19日 23:58:17 +0900


 和田です。
Yoshi wrote:
>$modeは"w"をつかってます。
>これはもんだいなんでしょうか?

 例えば次のようなスクリプトで、問題が発生するでしょう。
 $fp = fopen($file, "w");
 flock($fp, LOCK_EX);
 ...
 注意しなくてはならないのは、flock の前に fopen が実行されるこ
とです。当たり前なんですけど・・・。
 別のブラウザからのリクエストによって、$file で指定したファイル
がすでにロック中だったとしても、"w"で fopen を実行した時点でファ
イルサイズがゼロにされてしまうというこです。ロック中だと思って作
業している方のスクリプトにとっては、ファイルが壊れてしまうことに
なります。
 それで、私の場合は以下のようにして対処しました。
 $fp = fopen($file, "r+");
 flock($fp, LOCK_EX);
 ...
 PHPマニュアルの fopen の説明を一部引用しておきます。
>'r+' - 読みこみ・書きこみ用にオープンします。
> ファイルポインタをファイルの先頭に置きます。
>>'w' - 書きこみのオープンします。
> ファイルポインタをファイルの 先頭に置き、ファイルサイズを
> ゼロにします。ファイルが存在しない 場合には、作成を試みます。

おっと、PHPマニュアルの flock でこの問題がちゃんと注意されている
ではありませんか。
>注意 flock()は、ファイルポインタを必要とするため、(fopen()へ引
> 数"w"または"w+"を指定して)書き込 みモードでオープンするこ
> とにより丸めるファイルにアクセス保護する特別なロックファイ
> ルを使用する必要があるかもしれません。 

同様に「警告」の部分もしっかり読んでおいた方がいいと思います。
----
和田雅志 (WADA Masashi)
wada@hh.iij4u.or.jp

AltStyle によって変換されたページ (->オリジナル) /