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

WADA Masashi php-users@php.gr.jp
Sat, 19 Oct 2002 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