PHPで確実性の高いファイルロック(排他処理)方法はないでしょうか?

flock()が使えない環境でファイルロック処理が必要になっています。

検索はしてみたのですが、PHPでの処理には特に定番(?)もないようで、
また、誤った情報も多く、どの方法が確実性の高いのか?というところで悩んでいます。

なるべく確実性の高い例がありましたら、ちょっとした解説コメントとともに教えてください。

(既に、一通り検索済みなのでアドレスのみの回答はお控えください)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/01/13 21:50:03
  • 終了:2009/01/18 13:12:07

回答(3件)

id:yocchi24 No.1

yc24回答回数5ベストアンサー獲得回数02009/01/14 10:43:10

ポイント25pt

PHPでflockが使えないなら、サーバ側のロック処理の関数を使ったスクリプトを用意しておいて

それを呼び出すのはどうでしょうか?

排他処理が目的ではなく、ファイル書き込みが目的でなのであれば、

error_log関数を使って代用するのはいかがでしょう?

上記2案ともflock関数が使えない環境で試してないので対応可能か判りませんがご参考まで。



以下URLはダミーです

http://q.hatena.ne.jp/1231851001

id:wizemperor

なるほど、そういう手もありますね。

ただ、今回はPHPのみで処理したいもので…

Perlで使用されるリネーム方式を真似た方法もいくつかあるようですね。

どの程度確実なのか等、わかる方がいれば引き続き回答お願いします。

2009/01/14 15:27:33
id:yoneto164 No.2

ヨネちゃん回答回数813ベストアンサー獲得回数942009/01/15 00:33:38

ポイント25pt

flockが使えない環境で何とかやっています。


まず特定のディレクトリに任意のファイルが無いか確認してから、

空のファイルを作成するという軽度な作業を行い、

それから処理を開始します。

処理が終了したら作成したファイルを削除してロックを解除しています。

私は空のファイルを作成していますが、mkdir などでディレクトリを作成しても良いと思います。


とりあえずこの方法で上手く行っています。

参考になれば幸いです。


ほぼダミーですがhttp://jp.php.net/mkdir

id:wizemperor

perlでもよく使われている方法ですね

検索時に同様の手法のものを見つけましたが、

ただ、いろいろ議論もあるようですし、どの程度確実なのかなぁ、と。

2009/01/15 00:56:33
id:sphire No.3

sphire回答回数115ベストアンサー獲得回数122009/01/18 01:41:02

ポイント30pt

id:yoneto164 さんのやり方では

任意のファイルが無いか確認してから→*→空のファイルを作成

の*のタイミングでファイルを作られた場合に失敗します。

mkdirであれば、存在チェックとディレクトリ作成をアトミックに処理できますので安全です。

$filename='data.txt'; //操作したいファイル名
$lockdir=$filename . '.lock'; //ロック用ディレクトリ
while(!mkdir($lockdir)){ //ディレクトリ作成に失敗=ロック中
  usleep(100000); //0.1秒待つ
}
// $filename を操作…
rmdir($lockdir);

http://www.tohoho-web.com/wwwcgi8.htm

id:wizemperor

できるだけ隙をつくらないように、と。

ありがとうございました。これで、質問を終了させていただきます。

2009/01/18 13:10:55

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません