[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