CGIの多重起動を防ぐ方法はありますか?

[上に] [前に] [次に]
BB 2000/03/17(金) 19:35:58
掲示板を複数設置(KENT-WEBさんのプチボード)しているのですが
プロバイダーから警告を受けました。プロバイダーからは
CGIを頻繁に起動しなければよいとの答えをもらったので、いろいろ
探し回りましたが探すことができませんでした。ロックファイルを利
用するなどして一定時間内の起動ができないようにすることは無理
でしょうか?チャットは使いたくないのです。。
良い方法がありましたら教えてください。

びーだま [E-Mail] 2000/03/17(金) 22:34:03
> ロックファイルを利用するなどして一定時間内の起動が
> できないようにすることは無理でしょうか?

ロックファイルを利用するためにプログラムを起動させなければ
ならないならば、あまり意味がありません。

プチボードがどういう物かとか、BBさんの掲示板のにぎわいよう
がわからないので、適切な回答になっているかわかりませんが、

もし、ログの読み出し(閲覧)を行うためにも必ず、CGIを起動さ
せているようならば、出力ログをスタティックなHTMLファイルに
変更して、これに直接アクセス出来るように改造すれば、CGI起動
回数をおそらく8〜9割以上のを抑えることが可能かと思います。

たとえば、1日 合計 書き込みが100件程度あって、通常、圧倒的
に回数が多くなる閲覧が1000件程度あるアクセス数ならば、すべて
をCGIでアクセスしなければならない時には、1100回程度/日 の頻度
でCGIを起動しなければならないわけですが、直接HTMLを閲覧でき、
書込みだけをCGIにすることができれば、100件程度/日 起動させれ
ばよいということになります。

この程度のアクセス数なら、CGIを許可しているプロバイダである
以上文句は言われないでしょう(^^;

あとは、プロバイダから警告が来るということは、ただ、1000回や
2000回程度/日くらいなら、起動回数よりもむしろプロセスが長時間
残る。メモリをたくさん使う。CPU占有率が異常に高くなる。など、
プログラムの持つ何らかの欠陥の可能性を指摘されたと捉える方が
妥当なのかもしれません。

BB 2000/03/18(土) 01:50:16
お答えありがとうございます。

>ロックファイルを利用するためにプログラムを起動させなければ
>ならないならば、あまり意味がありません。

そうですか。考えればそのとおりですね。

>出力ログをスタティックなHTMLファイルに
>変更して、これに直接アクセス出来るように改造すれば、CGI起動
>回数をおそらく8〜9割以上のを抑えることが可能かと思います。

これを見まして挑戦してみましたが、難しいです。。
みようみまねで
open(HTML,">$write_file")
print HTML "・・・・・・\n";
close(HTML);
などと色々変えてみたんですけど、できませんでした。(^ ^;
完成されているCGIをHTML用に変更するのは困難でしょうか?
「初めてのPerl」を読み始めた程度のレベルです。(^ ^;
上記の改造のために役立つ書籍、サイトなどありましたらお教え
いただきたいのですが。(「もっと基礎からやれ」と言われるとつらい(^ ^;)

>メモリをたくさん使う。CPU占有率が異常に高くなる。など、
>プログラムの持つ何らかの欠陥の可能性を指摘されたと捉える方が
>妥当なのかもしれません。

topで見てますと他のCGIよりは高いようです。
表示の時なのか書き込みの時なのかはわからないですが。
ログの件数や1ページの表示件数は低めに設定してます。
関係ないでしょうか?

よろしくおねがいいたします。m(__)m

Ichi 2000/03/18(土) 06:31:38
>完成されているCGIをHTML用に変更するのは困難でしょうか?
これ自体はそんなに難しいことではありません。(perlがわかれば)

最初の方で
>open(HTML,">$write_file")

途中のprintを(エラーは除く)
>print HTML "・・・・・・\n";

終了時(エラー含む)に
>close(HTML);

で最後にlocationヘッダで$write_htmlに飛ばしてやればOKです。

>などと色々変えてみたんですけど、できませんでした。(^ ^;]
どの辺で失敗しているんですか?

びーだま [E-Mail] 2000/03/18(土) 12:24:06
> >完成されているCGIをHTML用に変更するのは困難でしょうか?
> これ自体はそんなに難しいことではありません。(perlがわかれば)

たしかに、スタティックファイルを書き出すようにするだけならば
難しくないんですが、そのスタティックファイルを参照するための
リンクをどう書くのか? とか、スタティックファイルにしたことで、
それに変更が加わるような場合、どのような手段をもって書けばよい
かなど、案外細かいフロー(あまり理解できてないならなおさら)で
引っかかることが多いと思います。

他人様の書いたコードを再構築するのは得てして大変な気がします。

参照に関しては、1ページで済ませてしまうから、URIは一意である。
なら、まあ問題にはなりませんね。

内容変更に関しては、SSIとか使って挿入してしまうのでは、この場合
本末転倒ですから、それをしないなら、何か認識子を作ってその中を
書き換えるロジックを新たに作る必要もあるかもしれません。

考えようによっては、結構大手術なのかも。
Perl わかれば簡単 なら、改造するより、0から書いた方が早い場合も
あるってことで・・・(^^;

> ログの件数や1ページの表示件数は低めに設定してます。
> 関係ないでしょうか?

それは、プログラムによると思います。
KENT-WEB さんの プチボードというものを見つけて、ソースをざっと見て
みましたところ、動かしていないので正確なことは言えませんが、

@lines = <IN>;

として、ログを全部読んで配列に入れてしまっているいるみたいですから、
表示件数はたとえ1件でも、ログを一度全部メモリに入れて、それから
該当のログだけ取りだそうとしてしまいますね。この方法では、ログが
大きければなるほど、比例的にメモリ喰いになるでしょう。

あとは、新しい配列変数やスカラー変数をたくさん作って、内容を次々
にコピーしている(メモリ使っている)割には、それを解放させていな
い様なところが多いのも気になります。つまり、グローバル変数でなく
ても良いのにグローバル変数になっているもの多いところが、あまり好ま
しくないように思います。

BB 2000/03/18(土) 15:03:52
[[解決]]
びーだまさん、Ichiさん、お答えありがとうございました。
やっぱり困難なようですね。今の私では無理な感じです。(;;)
while(<IN>) で1行ずつ読み込んで、というのは見たことが
あるのですが、それもわかりません。
今回諦めるわけではなく続けていくつもりですが、現状では
お答えいただいたことが理解できないようでご迷惑をおかけして
しまいますので、もう少し力をつけて出直します。
どうもありがとうございました。

[上に] [前に] [次に]