人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPで確実性の高いファイルロック(排他処理)方法はないでしょうか?
flock()が使えない環境でファイルロック処理が必要になっています。

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

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

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


●質問者: wizemperor
●カテゴリ:ウェブ制作
✍キーワード:Flock PHP アドレス コメント ファイル
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● yc24
●25ポイント

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

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

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

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

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



以下URLはダミーです

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

◎質問者からの返答

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

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

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

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


2 ● ヨネちゃん
●25ポイント

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


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

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

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

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

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


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

参考になれば幸いです。


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

◎質問者からの返答

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

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

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


3 ● sphire
●30ポイント

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

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ