• 締切済み

LOCK_EXはifの条件になり得るのか?

$fp = fopen("/tmp/lock.txt", "r+"); if (flock($fp, LOCK_EX)) { // 排他ロックを確保します ftruncate($fp, 0); // ファイルを切り詰めます fwrite($fp, "ここで何かを書きます\n"); fflush($fp); // 出力をフラッシュしてからロックを解放します flock($fp, LOCK_UN); // ロックを解放します } else { echo "ファイルを取得できません!"; } fclose($fp); PHPのマニュアルサイトに書いてあった例文なのですが、たぶんロックできなかった場合は「ファイルを取得できません!」に出るようにするというものだと思います。 ただ、LOCK_EXはロックできない場合は、ロックできるようになるまで待ちますよね? だとすると、このif文ってelseは機能しないと思うんですが、どうなんでしょうか? もしかしてLOCK_EXは時間制限があって、待ち状態が何分も続くとタイムアウトとしてFalseを返す? そのときにelseが動くということでしょうか? この例文の下にLOCK_NBを使ったものもあるので、LOCK_EXの動作を勘違いしてるとは思えません。 この例文はどのタイミングの時にFalseを返して、elseが動くのでしょうか? http://php.net/manual/ja/function.flock.php

みんなの回答

  • trytobe
  • ベストアンサー率36% (3457/9591)
回答No.1

「排他的にロックする」のが予めいると、その後に排他的ロックをしたいプロセスはブロックされて、排除される。 LOCK_NB との ORにして「ブロックしないけど排他的にロックする」のが予めいた場合は、その後に排他的ロックをしたいプロセスは「排他的ロックを横取りできて」許可される。(共有ではなく、横取り) どちらも、ロックを解除するのは LOCK_UN で解除。

関連するQ&A