トップページ⇒php
981コメント337KB

【Perl】ファイルロック(排他処理)について語ろう

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/06/23 10:18ID:eY2l+Gw1
どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません
0569nobodyさん03/11/09 18:46ID:???
>>565
>>566
無能か?(w
ググルとたくさんでてくるぞ、そのケース
0570nobodyさん03/11/09 18:58ID:???
わけわかんね。
サーバがflockをきちんと使えないシステムを採用してたとかじゃないの?
0571nobodyさん03/11/09 19:03ID:???
>>569
きっと君と同じぐらい無能なやつなんだろうね
ここでそんなこと言ってるのも君ぐらいだし
0572nobodyさん03/11/09 19:42ID:BVCYv2fe
>>570,571
馴れ合いはよそでやれよ・・・
ま、>>555は書いてるとうりにすれば問題無し
わざわざ混乱させんでもよかろうに
057357203/11/09 19:48ID:???
ageちまっていいスレだよな・・・

それか、
>>567-571はジエン厨じゃあなかろうなぁ?
0574nobodyさん03/11/09 19:55ID:4SnYD/Cs
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 |.本日選挙は20時迄!|
 |__________|
   ∧∧ ||
   ( ゚д゚)|| <残り10分切ったど!
   / づ     投票してない香具師は自衛隊の代わりにイラク逝けよ。

※総務省によると、総選挙の中間投票状況は
9日午後4時現在、全国平均で40.04%。前回を1.40ポイント下回っている。
0575nobodyさん03/11/09 19:59ID:???
>>573
あれが自演ならお前さんも>>569か?って事になるじゃん…。
本当だったら煽った挙句自演呼ばわりですかって感じで笑えるけど。
0576nobodyさん03/11/09 20:28ID:???
>>569
ハァ?
じゃあ「そのケース」とやらをここに貼れよ。
そのヘボ実装を検証してみようや。
0577nobodyさん03/11/09 20:54ID:???
>>572
馴れ合い?
0578nobodyさん03/11/09 21:14ID:???
>>577
「馴れ合い」の意味を知らないだけだろ。無知は構うな。ほっとけ。
057956403/11/10 14:47ID:???
あれ?flockが使える環境の人もこのスレの需要あったの?
まぁどっちでもこの場合変わらないけど。
0580nobodyさん03/11/10 14:53ID:???
>>561が勝手にflockと勘違いして
勝手に自分のやり方を押しつけたって事かぁ(・∀・)
0581nobodyさん03/11/10 16:11ID:???
>>580
ということにしたいのですね? :-)
0582nobodyさん03/11/10 16:19ID:???
もうほっとけほっとけ
0583nobodyさん03/11/10 16:43ID:???
♪か〜な〜しみ〜に〜であうた〜び〜
0584nobodyさん03/11/10 16:56ID:???
↓【Perl】flock() の使えない環境下でのファイルロック(排他処理)について語ろう
0585nobodyさん03/11/10 20:26ID:???
俺ん中の結論はRename形で、不雑なものになると管理が難しくなるんだよなぁ
0586nobodyさん03/11/10 20:34ID:???
>>585
何の管理?
0587nobodyさん03/11/10 20:37ID:???
同じディレクトリに複数のDATがある場合
ユニークなファイル名を生成するようにしないと。

…今思ったけど、たいした事無いなw
0588蟻の子一匹通さないロック03/11/14 04:40ID:uv5dJ3X6
10 GOTO アルカトラズ島;  # ロックへようこそ
20 処理;             
30 逆転無罪;          # 真犯人逮捕⇒釈放
0589nobodyさん03/11/14 05:44ID:???
>>580
>551からの流れでずっとflockの話だったわけだが。
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:???
1 nobodyさん 02/06/23 10:18 ID:eY2l+Gw1
 どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません
0594nobodyさん03/11/14 18:32ID:???
>>593
そいつは日本語が初心者なんだよw
0595nobodyさん03/11/14 18:38ID:???
たった今594が1を煽りました。
0596nobodyさん03/11/14 18:55ID:???
さあ、>>1よ щ(゚Д゚щ)カモーン!!
0597nobodyさん03/11/15 08:26ID:???
>>590はどうなの?
0598nobodyさん03/11/16 17:30ID:???
横レスすまんが、MySQLでも突っ込んでおけば、lockはぜんぶDBが
やってくれるやん・・・・・・・・ってのはだめなの?
あくまでOSにLockさせないとあかん?
0599nobodyさん03/11/16 17:34ID:???
はいはい、あっち行ってね
0600nobodyさん03/11/16 21:35ID:???
>>598
どうしてそうやって意地でも議論をループさせようとしますか?
0601nobodyさん03/11/17 02:04ID:???
あーごめん。実用の話じゃなくて、神学論争だったのね。
空気よめなかった。すまそ。
0602nobodyさん03/11/17 02:16ID:???
>>601
ていうか DB 使えるならその方がいいし、既に過去レスで全く同じやりとりが何度も出てるし。
0603nobodyさん03/11/18 14:37ID:???
>>601
釣れますか?
0604nobodyさん03/11/18 17:29ID:???
たとえば解析なしのアクセスカウンターにSQL使ってるのを俺は見た事ないな
俺が見た事ないだけかもしれないが
0605nobodyさん03/11/18 22:15ID:???
>>604 大規模サイトだと解析前提だからDBだな。そのほうが楽だし。
個人サイトならカウンタCGIを置くだけでしょ。壊れても問題ないし。

どしてもというなら、セマフォ管理するプロセスを立ち上げといて
それ使うって手もあるのかもしれんがそれならDB使うよ。
OSのファイルロックはアトミックじゃないっす。ソラリスでもそう。
マルチアクセス前提のファイルシステムもあるが、民生用じゃないな。
0606nobodyさん03/11/21 00:36ID:???
>>605
大規模サイトが、アクセスカウンターで解析するか?
ふつー、Webサーバのアクセスログを解析するだろ。

> OSのファイルロックはアトミックじゃないっす。ソラリスでもそう。
お前の使い方がヘボなだけ。
0607nobodyさん03/11/21 01:22ID:???
>>606 ログ解析だけで済めば世の中楽だよなー
0608nobodyさん03/11/21 01:56ID:???
607だけだとあおりみたいだから、いちおー。
確かに大規模サイトにはカウンタはないな。でもユーザーごとにレスポンスを
細かく制御すると、リアルタイムなユーザー管理いるからどうしてもDB。
ログ解析だけだとマーケティングデータしか出てこない。インタラクティブ
リアルタイムにそれ使わないと意味なしな。
静的なサイトでページビューだけでいいならログだけでいいけど、それじゃ
このスレの話題ずれる。
ちなみに俺はDB使わない程度のサイトならservletでロック処理。
0609nobodyさん03/11/21 02:13ID:???
>>608
スレタイを何度も声を出してよく読んでから発言した方が良いのでは?
どう考えてもあなたのレスはどれもこのスレにはお呼びでないと思うのですが?
0610nobodyさん03/11/21 02:23ID:???
>>609 あーすまん。607はあんまり口だすつもりなかったんだが
このスレには、人のことを「ヘボ」としか言わないやつがいて
それがどうもしゃくに障ったんでな。Perlの話しなくてスマソ。
0611nobodyさん03/11/22 00:21ID:???
>>608
Webアプリなら自前でログ持つ、バグ対応すること考えれば当たり前。

「ソラリス」なんて呼ぶ奴が「OSのファイルロックはアトミックじゃないっす」といった時は
使い方間違ってる確率99.9999%
0612nobodyさん03/11/23 05:00ID:???
「そらりす」って読んでた(;´Д`)アヒャ
0613nobodyさん03/11/23 05:24ID:???
>>612
いや、その読み方で合ってるし。
0614nobodyさん03/11/23 05:41ID:???
ところでDBMSで使ってるロック機構ってのは具体的にどんな処理なんでしょうか
単純に思いつくのはキューですが・・・
やっぱデーモンみたいな別プロセスに一括一元管理させるのが安全っちゃ安全ですよね?
0615nobodyさん03/12/04 07:40ID:???
ここは進行遅いですね。

結局、実用に耐えるファイルロックはどれなのか
スクリプト例でまとめて欲しい。おねがいエロイヒト。
0616nobodyさん03/12/04 11:19ID:???
>>10,>>12
0617nobodyさん03/12/13 19:02ID:???
昨日新しいファイルロック法思いついたんだけど寝て起きたら忘れてた
0618nobodyさん03/12/13 19:54ID:???
21世紀のファイルロックなんだろうな?
0619nobodyさん03/12/15 12:22ID:???
WinFS は SQLserver ベースになるそうだから
ファイルロックなんだかDBロックなんだかわからんような
あやしげなロックが提供されるんじゃないのか
0620nobodyさん03/12/15 19:16ID:???
Windowsはレジストリロックが使えます。
排他処理中はキーが書き込まれます。
0621nobodyさん03/12/19 21:19ID:???
今まで、flockが使えないと思ってたんだが、実は使えた!
ってこと無いですか?
0622nobodyさん03/12/19 23:28ID:???
ありませんね
あぁ、知識が足りなくて自分は使えないと?
やっぱりありませんね
0623nobodyさん03/12/20 02:36ID:???
$fp = fopen("test.txt", "a+");
if(!flock($fp, LOCK_EX)) { fclose($fp); echo "ns"; }
echo "ok";
これでいい?
0624nobodyさん03/12/20 02:38ID:???
windows環境で使えないと思ったけど普通に使えることに気が付いてびっくり。
つーかヘルプに書いてあった。
0625nobodyさん03/12/21 05:04ID:FyNOPbG5
きょうび、自作Perlスクリプトを置けるのに、flockが使えないISPなりレンタルサーバなんて、あるの?
0626nobodyさん03/12/21 16:43ID:???
yahoo
0627nobodyさん04/01/08 00:54ID:???
NiftyとかIswebとか使えるけど掛かるかどうかは保証しないとか言ってなかったっけ。
多分既出の話。
0628nobodyさん04/01/18 18:15ID:???
俺も需要がなくなってしまった。
ブックマークから外してしまおうかな。。
0629nobodyさん04/01/18 19:34ID:???
ひととおりネタは出尽くしたからもう外していいと思うよ。
0630nobodyさん04/01/18 20:27ID:???
でも、技術や発想的には応用が利くというかあれなので勿体無い気もする。
いままでありがとう。
0631nobodyさん04/01/19 01:52ID:???
テンプレが見たいなぁ、でも2スレまでいかんだろうなぁ。
0632nobodyさん04/03/11 20:28ID:???
久しぶりに着ますた。dat落ちしてなくてよかた。

ネタが尽きたところで脱線したいんですが、
includeしたりするファイルはflockの必要が無いことを前提としているんですかね。

書き換えや追記などを行うファイルに対し、
includeやrequireしたりするのはナンセンスということで合ってますか?
0633nobodyさん04/03/12 15:23ID:???
それは…
実行するperlスクリプト本体にflockの必要があるか、という話と同じなんじゃないかと
0634nobodyさん04/03/12 15:32ID:???
perl コマンド本体に flock する必要はありますか?
0635nobodyさん04/03/12 23:11ID:???
そういやperlメインのスレですね。スマソ。

PHPにおけるincludeやrequireは単にプログラムの記述されたファイルだけでなく、
HTML、PHP複合型やtxtまで読み込めるわけです。
そういった意味での質問です。
0636nobodyさん04/03/14 16:47ID:???
>>424
歯痛か!
0637nobodyさん04/03/15 12:04ID:???
>>635
php でも perl SSI でも何でもいいんだけど、ロックが重要になるのは基本的に、
ファイルを書き換えるプロセスが複数存在して競合する場合、つまり

A:----->読み込み------->処理-------->書き出し---------------------
B:------------------->読み込み------->処理-------->書き出し-------

のようなケースね。
ロックしないとマジでファイルが壊れたり情報が失われたりする。

これに対して include や require って、
読み込みオンリーで書き換えが有り得ないという前提なので、
上記のような書き込みの競合に参加しないわけで、
そういう意味ではロックの必要性が薄い。
(全く必要性が無いわけじゃないが、ほとんどの場合無視できる)
0638nobodyさん04/03/15 16:15ID:???
共有ロックのLOCK_SHってのがあるんですが、
厳密に言えばロックの必要性があることを示しているんですよね。
0639nobodyさん04/03/15 16:44ID:???
ロック「してもいい」ってだけで、「必要」かというとそうでもないんじゃない?
0640nobodyさん04/03/15 16:44ID:???
ていうか、ロックしてみたところで、書き換えようと思えばできるわけで。
0641nobodyさん04/03/15 18:08ID:???
perl は最初に一括コンパイルするからいいけど、
sh ってスクリプトを一行読み込んで実行してを繰り返すから、
実行途中にスクリプトを書き換えると結構悲惨なことになったりするよな。
0642nobodyさん04/03/17 13:37ID:???
rename使ってファイルロックかけるモジュール作って大ハマリしました。
どうもOSによっては、ファイルシステムの情報取得にタイムラグがあるようで、
renameかけても、OSが保持するファイル情報が即座に更新されないために、
同じ元ファイル名からのrenameが成功してしまうことがありました。

より正確にrename形式でファイルロックをかけるには、
rename後に若干のタイムラグを置いて、rename後のファイルの存在チェックが通れば
ロック成功と考えた方がいいですね。

ちなみに、WinXP+NTFSの組み合わせでそれらの現象がありました。
Linuxだったりすると、こういう現象は出てきますでしょうか?
0643nobodyさん04/03/17 16:25ID:???
んなバカな。
何か間違っている。
0644nobodyさん04/03/17 18:02ID:???
>>642
君が作ったのを晒してくれないか
0645nobodyさん04/03/18 13:24ID:???
>>644
了解です。
ttp://www.mindcompass.sfcgi.com/misc/LOCK.pm.txt
0646nobodyさん04/03/19 13:53ID:???
とりあえずmkdirやrenameを実行した後
仕方なく-dや-eをしなさい。
064764204/03/19 16:28ID:???
>>646

その辺(ファイル操作後の存在チェック)は仕方なく実装してます。
同一プロセスで、同じファイルからのrenameコマンドを連続して実行すると、2回目は失敗(これが通常動作)するので、
他プロセスでのファイル操作の結果が反映されるのが遅いらしい。
0648nobodyさん04/03/19 16:33ID:???
-d or mkdirじゃなくてmkdir or !-d
0649nobodyさん04/03/29 10:00ID:WLF8C9h8
ログに「This is a test1.」と10万回書くCGIと「This is a test2.」と10万回書くCGIを二つ同時起動させてみた。
ログにはきちんと20万行書かれてた。

for ($i = 0; $i < 10000; $i++) {
  open (DATA, ">>$file");
  flock (DATA, 2);
  print DATA $str;
  close DATA;
}

こういうのじゃ、そのOSでflockが使用可能かって言う確認にはならないのですか?
ちなみに、環境はWin2KとActivePerl5.6.1で試しましたが。
0650nobodyさん04/03/29 17:51ID:???
>>649
そもそも flock が使用不能なら呼び出した時点で実装されてないって怒られます。
実用的に使用可能か、という意味なら実際に試してみる価値があるかもしれません。
ただし、自分の想定している条件に近くないとあまり意味がないと思います。
0651nobodyさん04/03/31 01:14ID:???
子プロセスを10個forkしてプロセス一つで1000回カウンタを回すスクリプト使ってる。
perlで壊れないロックはflock()だけだった。
0652nobodyさん04/03/31 05:45ID:???
2chのロックはchmod()でやってるらしいね。
0653nobodyさん04/03/31 07:07ID:???
chmod()ではアトミックに書けないように思えるけど、
どんなんだろう。
0654nobodyさん04/03/31 12:43ID:???
chmod() でっていうのは具体的にどうやるの?
0655nobodyさん04/03/31 12:54ID:???
>>654
chmodがどういうものかわからないの?
0656nobodyさん04/03/31 13:50ID:???
時々書き込みしてもインデックスの数字が増えないことがあるが
ロックに失敗してると考えると納得できる話だな > 2chがchmodでロック
0657nobodyさん04/03/31 15:11ID:???
>>655
あなたはわかっているの?
0658nobodyさん04/03/31 18:13ID:???
運用情報のbbs.cgi再開発スレにチラッと載ってる。
0659nobodyさん04/03/31 21:42ID:???
>>658
1000ストップを確実にする方法の議論に見えました。
0660nobodyさん04/03/31 23:37ID:???
なんかflockを使いたくない議論してるよね。

どうせアトミックじゃないのなら
1000の書き込み後にchmodして
1001はクライアントで描画
dat落ち時にはdatに1001を書く、
とか適当にやれば1030くらいで止まるんじゃない?

ダサいけど。
0661nobodyさん04/04/10 18:40ID:???
余分な処理を追加して確実にするより1から書き直したほうがいいんじゃないかな。
運用の奴ら全員で1台のディスプレイを囲んで。
オンラインでの議論なんて無駄無駄。
0662nobodyさん04/04/16 01:00ID:???
filerock
0663nobodyさん04/04/19 09:45ID:???
ロック状態の情報をロックファイルの中に書いておこうと思ったら、
ロックファイルをファイルロックしなければならなくなった。orz
0664nobodyさん04/04/21 07:50ID:???
ロックファイルをファイルロックした情報をロックファイルに書くことはしないんでしょう。
0665nobodyさん04/04/21 12:24ID:???
ロックファイルは存在が全てです。
よくある流行歌の「君がいるだけで」というフレーズが言い当てています。
0666nobodyさん04/04/23 14:39ID:???
たとえばーきみがいるだーけでこころがーろっくされるーことー
0667nobodyさん04/04/26 01:30ID:???
renameするロックはうまく書けば完璧かなと思ったが、外からの干渉に弱い気がする。
0668nobodyさん04/04/26 01:31ID:???
干渉とは?
■ このスレッドは過去ログ倉庫に格納されています