【Perl】ファイルロック(排他処理)について語ろう
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/06/23 10:18ID:eY2l+Gw10543nobodyさん
03/10/03 18:51ID:???これって安全そうでよさげな気はするんだけど、
ちょっと思ったんだけど、ものすごくアクセス多い場合に、
ディレクトリ作成〜ファイルリスト検査のタイムラグのせいで、
いつまでたってもだれもロックを取得できない、ってな状況になりそうな気がする。
0544531
03/10/05 10:57ID:???今度の奴は、ロックする側のプロセスがタイムアウト時間を個別に設定できます。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html
>>543
確かにファイルリスト検査に時間がかかるが、ならばどうしろと?
0545nobodyさん
03/10/06 12:54ID:???いや、どうすればいいか私にも思い付きません。すいません。
単にデメリットを挙げてみただけで、
だからといってその方法が使えねーとかいう気も毛頭ありません。
0546531
03/10/06 22:56ID:???さらに一念発起してrename方式に変更してロック処理にかかる負荷を低減してみました。
rename方式でテストしたらロックがぶっ壊れるなー、とか思ってたら
ロック検証用のルーチンの書き方に問題があった罠。
同じファイルを読み込みと書き込みで2回オープンして、しかもバッファ処理をカットしてなかったので、
スクリプト上では書き込んだつもりでもファイルシステム上では「まだ」書き込まれてない場合があることに
ようやく気がついた。
教訓。
ロック処理が正しくても、ファイル入出力の部分の書き方によっては思わぬファイル破損がありうる。
0547531
03/10/07 18:17ID:???やっぱりread-write lockってむづかしいでつね。
rename方式だと、共有ロックをかけているプロセス数が分からないといつロック解除していいかわからない。
ロックプロセス数を安全に記録するために、内部で排他ロックをかけなければいけない罠w
これでどのくらいロック処理で負荷がかかるか、だな。
0548nobodyさん
03/10/29 05:07ID:???例えば掲示板で最初のページだけ静的なファイルにしたいという場合、
ログとその最初のページの両方を同時にロックしないといけないので。
FLOCKのディレクトリ版とかあれば便利なのですが…。
0549nobodyさん
03/10/29 06:01ID:???ロック開始と解除の間で必要なファイルを扱えばいいだけ
ロックの仕組みを根本的に理解していないんじゃないか?
もうちょっと勉強せい
0550nobodyさん
03/10/29 08:13ID:???http://pc2.2ch.net/test/read.cgi/php/1024795138/
0551nobodyさん
03/11/03 16:44ID:???ttp://www98.sakura.ne.jp/~jun/perl/flock.html#02
0552nobodyさん
03/11/05 02:38ID:???flockってロックしたファイルが閉じるまでに開いた他のファイルまで
全部ロックしちゃうの?
0555nobodyさん
03/11/05 14:16ID:???読んだけど。
かいつまんで書くと
lockfileを開く
lockfileをロック
count.txtを開く
上書き
count.txtを閉じる
addr.txtを開く
追記
addr.txtを閉じる
lockfileをアンロック
だよね。
count.txtとaddr.txtには直接ロックかけてなくて
lockfileをロックすることによりこの二つのファイルもロックされてるらしいから
>551みたいに言った。
0556nobodyさん
03/11/05 14:16ID:???0557nobodyさん
03/11/05 14:28ID:???よく考えたらlockfileがロックされてるときはそこから先に進まないから大丈夫なのか。
0558nobodyさん
03/11/08 02:04ID:???どっちかのファイルにロックかけて最後まで開いてるままで十分だけどな。
0560nobodyさん
03/11/08 13:37ID:???0562nobodyさん
03/11/08 17:35ID:???0563nobodyさん
03/11/09 03:10ID:???レアケースだろうけど
似たような事して壊れたことあるよ
無茶苦茶って事では無いだろうが、
そのやり方だと同時オープンで
2人アクセスしてきたのに1しかカウントアップしないって
ケースがタイミング良ければ発生する程度かな
0567nobodyさん
03/11/09 18:12ID:???単に読み込みをブロックしてなかっただけってオチなんじゃ。
それか二つのファイルでファイルハンドルを同じにしちゃったとか…。
>564
open(COUNT, "+<$cfile");
flock(COUNT, 2);
(中略)
open(ADDR, ">>$afile");
(中略)
close(ADDR);
couse(COUNT);
0568nobodyさん
03/11/09 18:18ID:???複数のスクリプトが複数の同じファイルを読み書きする場合は
ロック用ファイルを一つ用意する方が管理が楽なのは当たり前。
でもカウンターのようにファイルが単一のスクリプトからしか読み書きされない場合は
どちらか先に読む方のファイルをロックしておけば十分。
0570nobodyさん
03/11/09 18:58ID:???サーバがflockをきちんと使えないシステムを採用してたとかじゃないの?
0572nobodyさん
03/11/09 19:42ID:BVCYv2fe馴れ合いはよそでやれよ・・・
ま、>>555は書いてるとうりにすれば問題無し
わざわざ混乱させんでもよかろうに
0574nobodyさん
03/11/09 19:55ID:4SnYD/Cs|.本日選挙は20時迄!|
|__________|
∧∧ ||
( ゚д゚)|| <残り10分切ったど!
/ づ 投票してない香具師は自衛隊の代わりにイラク逝けよ。
※総務省によると、総選挙の中間投票状況は
9日午後4時現在、全国平均で40.04%。前回を1.40ポイント下回っている。
0575nobodyさん
03/11/09 19:59ID:???あれが自演ならお前さんも>>569か?って事になるじゃん…。
本当だったら煽った挙句自演呼ばわりですかって感じで笑えるけど。
0579564
03/11/10 14:47ID:???まぁどっちでもこの場合変わらないけど。
0582nobodyさん
03/11/10 16:19ID:???0583nobodyさん
03/11/10 16:43ID:???0584nobodyさん
03/11/10 16:56ID:???0585nobodyさん
03/11/10 20:26ID:???0587nobodyさん
03/11/10 20:37ID:???ユニークなファイル名を生成するようにしないと。
…今思ったけど、たいした事無いなw
0588蟻の子一匹通さないロック
03/11/14 04:40ID:uv5dJ3X620 処理;
30 逆転無罪; # 真犯人逮捕⇒釈放
0590nobodyさん
03/11/14 16:05ID:???つーか変わってくるとしたらあれだ・・・
掲示板とかのスクリプトで
LOG→HTML随時吐き出し型
じゃなく
LOG=HTMLを表示する型
の場合、Rename型の排他処理は行えない可能性がある。
ということで。
結論から言えば退避ファイル名をhtml→htmとか適当に変えればいいんだろうけど。
0591nobodyさん
03/11/14 17:52ID:???・flockが使えない環境ではどうしてる?
・ロックの有効性はその方法でなく、ロックを組み込む場所が大事。壊れる原因の大半は誤った使い方によるものなので、ありがちな落とし穴の再検証をしよう。
後者をよく理解してない初心者・中級者が、「flockで壊れた!flock使えねー」とわめいて、前者と後者をまぜこぜにして語って、スレが荒れるのが常。
0592nobodyさん
03/11/14 18:00ID:???0593nobodyさん
03/11/14 18:11ID:???どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません
0595nobodyさん
03/11/14 18:38ID:???0598nobodyさん
03/11/16 17:30ID:???やってくれるやん・・・・・・・・ってのはだめなの?
あくまでOSにLockさせないとあかん?
0599nobodyさん
03/11/16 17:34ID:???0601nobodyさん
03/11/17 02:04ID:???空気よめなかった。すまそ。
0604nobodyさん
03/11/18 17:29ID:???俺が見た事ないだけかもしれないが
0605nobodyさん
03/11/18 22:15ID:???個人サイトならカウンタCGIを置くだけでしょ。壊れても問題ないし。
どしてもというなら、セマフォ管理するプロセスを立ち上げといて
それ使うって手もあるのかもしれんがそれならDB使うよ。
OSのファイルロックはアトミックじゃないっす。ソラリスでもそう。
マルチアクセス前提のファイルシステムもあるが、民生用じゃないな。
0606nobodyさん
03/11/21 00:36ID:???大規模サイトが、アクセスカウンターで解析するか?
ふつー、Webサーバのアクセスログを解析するだろ。
> OSのファイルロックはアトミックじゃないっす。ソラリスでもそう。
お前の使い方がヘボなだけ。
0608nobodyさん
03/11/21 01:56ID:???確かに大規模サイトにはカウンタはないな。でもユーザーごとにレスポンスを
細かく制御すると、リアルタイムなユーザー管理いるからどうしてもDB。
ログ解析だけだとマーケティングデータしか出てこない。インタラクティブ
リアルタイムにそれ使わないと意味なしな。
静的なサイトでページビューだけでいいならログだけでいいけど、それじゃ
このスレの話題ずれる。
ちなみに俺はDB使わない程度のサイトならservletでロック処理。
0609nobodyさん
03/11/21 02:13ID:???スレタイを何度も声を出してよく読んでから発言した方が良いのでは?
どう考えてもあなたのレスはどれもこのスレにはお呼びでないと思うのですが?
0610nobodyさん
03/11/21 02:23ID:???このスレには、人のことを「ヘボ」としか言わないやつがいて
それがどうもしゃくに障ったんでな。Perlの話しなくてスマソ。
0611nobodyさん
03/11/22 00:21ID:???Webアプリなら自前でログ持つ、バグ対応すること考えれば当たり前。
「ソラリス」なんて呼ぶ奴が「OSのファイルロックはアトミックじゃないっす」といった時は
使い方間違ってる確率99.9999%
0612nobodyさん
03/11/23 05:00ID:???0614nobodyさん
03/11/23 05:41ID:???単純に思いつくのはキューですが・・・
やっぱデーモンみたいな別プロセスに一括一元管理させるのが安全っちゃ安全ですよね?
0615nobodyさん
03/12/04 07:40ID:???結局、実用に耐えるファイルロックはどれなのか
スクリプト例でまとめて欲しい。おねがいエロイヒト。
0617nobodyさん
03/12/13 19:02ID:???0618nobodyさん
03/12/13 19:54ID:???0619nobodyさん
03/12/15 12:22ID:???ファイルロックなんだかDBロックなんだかわからんような
あやしげなロックが提供されるんじゃないのか
0620nobodyさん
03/12/15 19:16ID:???排他処理中はキーが書き込まれます。
0621nobodyさん
03/12/19 21:19ID:???ってこと無いですか?
0622nobodyさん
03/12/19 23:28ID:???あぁ、知識が足りなくて自分は使えないと?
やっぱりありませんね
0623nobodyさん
03/12/20 02:36ID:???if(!flock($fp, LOCK_EX)) { fclose($fp); echo "ns"; }
echo "ok";
これでいい?
0624nobodyさん
03/12/20 02:38ID:???つーかヘルプに書いてあった。
0625nobodyさん
03/12/21 05:04ID:FyNOPbG50626nobodyさん
03/12/21 16:43ID:???0627nobodyさん
04/01/08 00:54ID:???多分既出の話。
0628nobodyさん
04/01/18 18:15ID:???ブックマークから外してしまおうかな。。
0629nobodyさん
04/01/18 19:34ID:???0630nobodyさん
04/01/18 20:27ID:???いままでありがとう。
0631nobodyさん
04/01/19 01:52ID:???0632nobodyさん
04/03/11 20:28ID:???ネタが尽きたところで脱線したいんですが、
includeしたりするファイルはflockの必要が無いことを前提としているんですかね。
書き換えや追記などを行うファイルに対し、
includeやrequireしたりするのはナンセンスということで合ってますか?
0633nobodyさん
04/03/12 15:23ID:???実行するperlスクリプト本体にflockの必要があるか、という話と同じなんじゃないかと
0634nobodyさん
04/03/12 15:32ID:???0635nobodyさん
04/03/12 23:11ID:???PHPにおけるincludeやrequireは単にプログラムの記述されたファイルだけでなく、
HTML、PHP複合型やtxtまで読み込めるわけです。
そういった意味での質問です。
0637nobodyさん
04/03/15 12:04ID:???php でも perl SSI でも何でもいいんだけど、ロックが重要になるのは基本的に、
ファイルを書き換えるプロセスが複数存在して競合する場合、つまり
A:----->読み込み------->処理-------->書き出し---------------------
B:------------------->読み込み------->処理-------->書き出し-------
のようなケースね。
ロックしないとマジでファイルが壊れたり情報が失われたりする。
これに対して include や require って、
読み込みオンリーで書き換えが有り得ないという前提なので、
上記のような書き込みの競合に参加しないわけで、
そういう意味ではロックの必要性が薄い。
(全く必要性が無いわけじゃないが、ほとんどの場合無視できる)
0638nobodyさん
04/03/15 16:15ID:???厳密に言えばロックの必要性があることを示しているんですよね。
0639nobodyさん
04/03/15 16:44ID:???0640nobodyさん
04/03/15 16:44ID:???0641nobodyさん
04/03/15 18:08ID:???sh ってスクリプトを一行読み込んで実行してを繰り返すから、
実行途中にスクリプトを書き換えると結構悲惨なことになったりするよな。
0642nobodyさん
04/03/17 13:37ID:???どうもOSによっては、ファイルシステムの情報取得にタイムラグがあるようで、
renameかけても、OSが保持するファイル情報が即座に更新されないために、
同じ元ファイル名からのrenameが成功してしまうことがありました。
より正確にrename形式でファイルロックをかけるには、
rename後に若干のタイムラグを置いて、rename後のファイルの存在チェックが通れば
ロック成功と考えた方がいいですね。
ちなみに、WinXP+NTFSの組み合わせでそれらの現象がありました。
Linuxだったりすると、こういう現象は出てきますでしょうか?
■ このスレッドは過去ログ倉庫に格納されています