• 締切済み

flockのファイル保持について

一つのブラウザで以下のプログラムを動かしつつ、、 ---- lock.php ---- <?php $filnam = "./log.txt"; $fp = fopen($filnam,"w"); flock($fp, LOCK_SH); ?> ここでしばらく待つ。 <?php sleep(30); flose($fp); ?> ------------------ もう一つのブラウザで ---- if.php ---- <?php $filnam = "./log.txt"; $fp = fopen($filnam,"w"); // ・・・(1) if(!flock($fp, LOCK_EX)){ print ("ロックされています。<BR>"); }else{ print ("ロックされていません。<BR>"); } ?> ------------------ を動かしました。 期待していた結果は 「ロックされています。」の表示です。 ですが、lock.phpプログラムの終了を、(1)の部分で待っているようで、lock.phpプログラムが終了後、「ロックされていません。」の表示になります。 ロックされていたらすぐに「ロックされています。」の表示を出したいのですが、どうしたらいいでしょうか?何か勘違いをしている部分があればご教授ください。

みんなの回答

  • kabinett
  • ベストアンサー率60% (9/15)
回答No.2

PHPのflockは通常ブロックモード(ロックが開放されるまで待つモード)で実行されます。 これをノンブロックモード(ロックの開放を待たないモード)で実行するには、2番目の引数にLOCK_NBを追加します。 今回の場合では、if.phpの方で、 if(!flock($fp, LOCK_EX)){ となっている部分を if(!flock($fp, LOCK_EX | LOCK_NB)){ とします。 こうすると、ロックされていた場合flockはすぐにFALSEで返ります。

参考URL:
http://php.s3.to/man/function.flock.html
goroneko-begin
質問者

お礼

回答ありがとうございます。 しかし、 $fp = fopen($filnam,"w"); // ・・・(1) の部分で解除を待っている状態なのですが。。。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

どうやらflockの仕様でロックがされている場合は解放されるまで待つみたいですね。 すぐに結果を出す場合は自前で排他処理を作るしかないような・・・?

goroneko-begin
質問者

お礼

flockの動きとしては私の認識で間違いはなかったということですね。回答ありがとうございます。 自前で作るとなると、ファイルやフォルダを作って排他処理の判断となりますが処理中にブラウザが閉じられたり違反処理があってエラーが出てしまうと永久に排他状態になる事を懸念しています。排他処理して結構プロセスの重い仕事をさせたいのです。 そのため、他のユーザがアクセスしてきたときには、さっさとあきらめて、ちょっと待ってねメッセージを出そうと思っています。 実現可能な方法をご存知であればご教授ください。

関連するQ&A

専門家に質問してみよう