WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:サーバーダウン

0:[投稿] ダンサー [2002/09/10 22:02 ][環境:WIN+IE WIN系+Perl]

これからどこかで自作CGI(掲示板)を試してみたいと思うのですがサーバーがとまるのは無限ループから抜け出せなくなるときです
よね?
ファイルに書き込むときにflock(ANSWER,2);
をしてユーザに書きこませないようにしても意味がない
のでしょうか?
たとえば一人のユーザーが書きこんでいるときにまた違う
他のユーザが書き込んでしまうと無限ループになって
サーバがとまってしまうとかでしょうか?
問題はファイルに書き込んでいるときの処理ですよね?


1:[回答] ... [2002/09/10 22:17 ]

>これからどこかで自作CGI(掲示板)を試してみたいと思うのですが
お願いですから試すのは自分のサーバーにしてください。
意図的にサーバーを止めたり負荷をかけたりすると、最悪の場合損害賠償請求されます。

>サーバーがとまるのは無限ループから抜け出せなくなるとき
今時はその程度では止まりません。
通常のサーバーなら長時間終了しないプロセスはサーバー側で止められます。

flockとは排他制御を行う時に使います。
自分がアクセスしている間に他からのアクセスを防ぎます。
http://tohoho.wakusei.ne.jp/wwwperl2.htm#flock


2:[質問] ダンサー [2002/09/11 07:10 ]

...さんありがとうございました。
もちろん自分のパソコンでテスト済みです。
ファイルを読み込むときもファイルロック
したほうがいいのですか?
読み込みの場合もこの処理でいいのでしょうか?
open(OUT, "+< outfile.txt");
flock(OUT, 2);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT "........";
close(OUT);


3:[質問] ダンサー [2002/09/11 12:29 ]

失礼しました
読み込むときのファイルロックです。
open(OUT, "> outfile.txt");
flock(OUT, 1);
print OUT "........";
close(OUT);
これでいいのでしょうか?


4:[回答] ... [2002/09/12 14:18 ]

>もちろん自分のパソコンでテスト済みです。
う〜んどういうテストをしたのだろう?

open FH,"+<file" は読み書きモードです。
open FH,">file" は書き込み専用モードです。
open FH, file で読み込みます。

排他制御やファイルロックで検索してみましたか?
ネットにはかなりの情報が有ると思いますよ。
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock


5:[質問] ダンサー [2002/09/12 21:34 ]

...さんありがとうございました。
>>もちろん自分のパソコンでテスト済みです。
>う〜んどういうテストをしたのだろう?
排他制御などはしていませんが書き込みとか・・・(^^;。

損害賠償のこととなるとやはり自作(CGI)はやはり危険で
しょうか?自分のサーバーは持ってないけど出来合いのCGIでは
せっかく作り上げたものがもったいないような気もします。

プロバイダに聞いてみると実績のないCGIは使用しないで
ください、しかもやめたほうがいいと言われました。
そして実績のあるものを使えといってきました。
ちょっとショックで
どうしようかと考えている昨今であります。


6:[質問] ダンサー [2002/09/13 22:04 ]

ファイルロックで

sub my_flock {
 my %lfh = (dir => './lockdir/', basename => 'lockfile',
         timeout => 60, trytime => 10, @_);

 $lfh{path} = $lfh{dir} . $lfh{basename};

 for (my $i = 0; $i < $lfh{trytime}; $i++, sleep 1) {
   return \%lfh if (rename($lfh{path}, $lfh{current} = $lfh{path} . time));
 }
 opendir(LOCKDIR, $lfh{dir});
 my @filelist = readdir(LOCKDIR);
 closedir(LOCKDIR);
 foreach (@filelist) {
   if (/^$lfh{basename}(\d+)/) {
     return \%lfh if (time - $1 > $lfh{timeout} and
      rename($lfh{dir} . $_, $lfh{current} = $lfh{path} . time));
     last;
   }
 }
 undef;
}

sub my_funlock {
 rename($_[0]->{current}, $_[0]->{path});
}
ロックする時は
$lfh = my_flock() or die 'Busy!';
でロックを解除する時は
my_funlock($lfh);でいいのですね。

ところで
1.ロックする
2.ファイルを読み込む
3.一時ファイルに書き込む
4.一時ファイルを元ファイルにリネームする
5.アンロックする

1.2.5はわかりましたが3.4もこのプログラムの中に組み込んで
あるということでいいのでしょうか?



7:[回答] アリソン [2002/09/15 04:33 ]

>問題はファイルに書き込んでいるときの処理ですよね?

それだけじゃないと思う。


8:[質問] ダンサー [2002/09/15 21:45 ]

アリソンさんありがとうございました。
えーとファイルロックの方の質問をだれかお願いいたします。


9:[回答] TOM neko [2002/09/15 23:00 ]

サーバで安全に使用できるプログラムを作るなら、何をやっているかよく理解できないものを、コピーしてきて使うのはやめましょう。たとえれば、目隠しして車の運転してるようなもので、他から見ると「あぶねーからこっちくるなよー」って感じですか。目隠しがとれるようがんばって下さい。

上記のロックはちょっと複雑ですが、ロック以外のことはしていません。


10:[完了] ダンサー [2002/09/16 22:04 ]

TOM nekoさんありがとうございました
そうですよね。わかる物を使いたいと思います。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World