[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