• 締切済み

排他制御について

初めまして。 今回初めての投稿になります。 至らないことが多々あるかと思いますがその時は、ご指摘ください。 本題に、入りますと 今アクセスカウンターを作成してるのですけど。 サーバーでflock関数が使えないようなので、排他制御をmkdirでしようと色々調べていたのですが 下のようなサンプルを見つけ色々いじってみたんですが(下記はサンプルのままです。途中にechoがあったので消しておきましたが。) 疑問があります。 $dirnam = "lock"; $scnt0 = 0; while(mkdir($dirnam) === FALSE){ if ($scnt0++ >= 3){ rmdir($dirnam); exit(); } sleep(1); } $scnt0 = 0; while(mkdir($dirnam) === FALSE){ if ($scnt0++ >= 3){ rmdir($dirnam); exit(); } sleep(1); } rmdir($dirnam); 1:3行目は、下記の用に記述では何か問題があるのでしょうか? if(mkdir($dirnam) === FALSE){ while($sct0++ >= 3){ rmdir($dirnam); exit(); } sleep(1); } 2:この構文だと同時アクセスした時に、仮に最初のアクセスが3秒以上かかった場合(ほぼそんなことは、ないだろうと思いますが)lockディレクトリーを消してしまう可能性があるかどうかです。 PHPは、初心者です。 よろしくお願いします。 OS:XP サーバー:レンタル(ホスティング) PHPver:PHP5.3.1

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.1

>1:3行目は、下記の用に記述では何か問題があるのでしょうか? 意味不明の処理です。 >2:この構文だと同時アクセスした時に、仮に最初のアクセスが3秒以上かかった場合(ほぼそんなことは、ないだろうと思いますが)lockディレクトリーを消してしまう可能性があるかどうかです。 はい。3秒かかってもロックが取れない場合はディレクトリを消してしまうコードになっています。 最初の処理が3秒以上かかった場合だけでなく、1秒ごとにチェックしたタイミングで運悪く他のプロセスにロックを取られるということが3回続くとディレクトリを消してしまいます。 あまり良くないコードですね。

関連するQ&A

専門家に質問してみよう