■ bbs.cgi(SpeedyCGI)の巻 part1 (2004/12/01-)
■ bbs.cgi(SpeedyCGI)の巻 part1 (2004/12/01-)
とりあえず、SpeedyCGI化は成功。
しかし、先は長そう。さてどうすべきか。
1) bbs.cgi の改良(再入可能化?)により、speedy -- -r1 以外で起動可能にする
2) speedycgiの設定チューニング(並列度とかいろいろ)
あたりから詰めていくことになるのかなと。
参考スレ:
■ read.cgi(DSO味)の巻 part1 (2004/12/01-)
http://dso.2ch.net/test/read.cgi/myanmar/1101888913/
【Project peko】2ch特化型サーバ・ロケーション構築作戦 Part15
http://qb5.2ch.net/test/read.cgi/operate/1093068260/ …しかし、私はPerlがからっきし(りゃ なので、
Itadaいたり不動の楽しみをお持ちだったりする方々などのお力を、
ぜひお借りしたいところかも、かも。 一部dso化できればいいんですがねー
今のあばうと処理手順をかいてみてくださいまし 私なりに考えてみると
1) main はどうかけばいいのか、
2) 変数(とくにグローバル)はどう書けばいいのか、
あたりなんです。
枠組みが理解できれば、書き直す人も増えるかも、 現在の流れは(bbs.cgi)
test/bbs.cgi ← 小さい導入部、なるべく叩き落せるのはここでやる。
require '本体bbs.cgi' 以降処理は'本体bbs/cgi'へ
ほとんど(多分全部かも)は戻ってこない、どっかで exit;
本体bbs.cgi
いろんな処理をして、どっかで exit; されている >>6
まずtest/bbs.cgiは
1)環境変数を整理
2)setting.txtを読み込む
3)ふるい落とし処理
バーボンハウスチェック>bbqまたはbbmチェック>sambaチェック>rockチェック
# バーボンとsambaが機能的に一部かぶっている希ガスのですが・・・
4)その他処理?(なんかあったっけ)
ですかね >>7
3)のところ(bb?チェックまで)
if(barbon(ip)){
error(barbon);
exit;
}
endif;
if(けーたい)
if(callbbm(id)==だめぽ){
error(bbm);
exit;
}endif;
else
if(callbbq(ip)==だめぽ){
error(bbq);
exit;
}endif;
endif; あ、これ(>>7)じゃちとまずい。いろいろ軽め且つはじき要素が入ってない。
特にrockは本文のチェックが入るから処理が重いと思われなので後回し。
処理の原則は環境変数>別途ファイルに格納されている設定値>本文の順かな というか
目的は SpeedyCGI のフル機能を実現するには
どのようにコーディングすればいいか? なんですよ。
http://perldoc.jp/docs/modules/CGI-SpeedyCGI-2.21/SpeedyCGI.pod
> speedyが他のリクエストを開始したとき、どのくらいの量のperlの状態が保持されますか?
> グローバルはその値を保持していますか?リクエストの後にデストラクタが走りますか?
>
> グローバルはその値を保持します。リクエストの後は何も破壊されません。 STDIN/STDOUT/
> STDERRはクローズされます -- 他のファイルはそうではありません。 %ENV と @ARGVだけが
> リクエストの間で変更されるグローバルになります。 ファイルハンドルは基本的に毎回クローズすべき、
変数も初期化しないとだめ、か。
%ENVと@ARGVは呼び出された時に
ソースの処理の前に値が代入されるからな、 bbs.cgi が呼び出されて
その処理が終らないうちに次ぎづぎにbbs.cgi が立ち上がる(呼ばれる)ので
都度初期化するというよりは、完璧に分離しなきゃならないってことかと
つまり スタックを使うしか無いんだと思うんだな、
Perl ではどうやってやるの?
>>12
setting.txtとsamba設定、rockワードリストの読み込みぐらいしかできることがなさそう・・・
固定値はこれらだけのはず・・・
# これらもあやしかったりするけど・・・
perlでスタックはこんなんありました。
http://www2u.biglobe.ne.jp/~MAS/perl/waza/stack.html んにゃ、こっちか。
> 私のperlアプリケーションがspeedyで動くためには変更する必要があるかは、どうすれば判断
> することができますか?あるいは何も変更は必要ないのでしょうか?
>
> 変更する必要があるかもしれません。
>
> グローバルが実行の間で保持されます。例えば永続的なデータベース・ハンドルを保つという
> ことではいいことかもしれませんが、あなたのコードがそれらが未定義であることを想定して
> いればよくありません。
>
> また、グローバル変数を"my"で作成するならば、サブルーチンの中からそれらの変数を参照し
> ようとするべきではありません - その代わりにそれらをサブルーチンに渡すべきです。ある
> いは完全に問題をさけるために、単にmyの代わりに"use vars"でグローバル変数を宣言したほ
> うが、まだましです。
>
> ここに、この問題についての素晴らしい説明があります - これはmod_perlについてですが同
> じことがspeedycgiにも当てはまります:
>
> http://perl.apache.org/faq/mod_perl_cgi.html#Variables_retain_their_value_fro
>
> 全てが失敗するのであれば、MaxRunsを1に設定することにより常駐を無効にすることができま
> す。これが通常のperlに比較しての唯一の利点は、speedyがスクリプトを事前にコンパイルす
> ることにあります。 my @stack = ();
push @stack, '1'; #@stack=('1')
push @stack, '2'; #@stack=('1', '2')
pop @stack; #@stack=('1')
push @stack, '3'; #@stack=('1', '3')
pop @stack; #@stack=('1')
pop @stack; #@stack=()
かねぇ。これがスタックではなくキューだと、popじゃなくてshiftか。
----
push 末尾に要素(スカラー変数/リスト変数)を追加、追加後のリストの要素数をリターン
pop リストから末尾の1要素を取り除く、取り除いた要素をリターン
shift リストから先頭の1要素を取り除く、取り除いた要素をリターン そんなややこしいことしなくても
単にグローバル変数を使わなければすむと思う。。 >>17
使わないとすれば
たとえばどんなコーディングすればいいのかなぁ
(すんません Perlしらんもんで) >>18
グローバルなしだとmod_perlと大差ないらしいっすよ・・・>speedy sub{ } でくくってないところでは変数を極力使わない方向で、ってところですかね。
あと、sub{ } のなかでも変数宣言なしでの変数の使用はしちゃいけないとか。 >>20
極端なことをいえば、全部の変数をmainで宣言ですか・・・
かえります。 私の至らなさを簡単にいえば
#!/usr/bin/perl
#
$aaa = "";
my $bbb = "";
&gogo($aaa,$bbb);
sub gogo
{
my $ccc = "";
print "$aaa $bbb $ccc";
}
exit;
なんてコード書いて $aaa , $bbb , $ccc はどみに実態があるの?
というのを私が知らないんです。
$bbb , $ccc はスタックのような気もするのですが・・・
$aaa はグローバル? (static , CS←コードセグメント?)
うーん、誰か教えてちょ >>22
(;´д`)
その例だと、$aaa、$bbbはグローバル変数、$cccはローカル変数ですね、(コード全般にわたって)
それで、&gogo($aaa,$bbb); は&gogo; としても挙動は変わんないかと、
サブルーチンを呼び出す時、&gogo($aaa,$bbb); では、($aaa,$bbb)を引数として
gogoという関数を呼び出している、という意味になるわけですが、
それをsub gogo でどう引き出すか、というと、sub gogoの中で my ($a,$b) = @_; あたりにするんですよね。
つまり、サブルーチンに渡された引数はPerlでは@_ に入ってるんですね、
しかし、@_を使わないで直接$aaa,$bbb と書くと、直接グローバル変数のほうを見に行くんですよね。 ということは まず最初にやる実験は
>>21 さんの言うような感じになるのかな? どなのかな?
$aaa , $bbb がグローバルなら
数十個あると思われ。。。
どこでどう使われているかもとっても不明なのだ、
あと、これはどうなるんだろ
use strict 'vars'; が宣言されていて
use vars qw($version);
$version ='20041104';
こんな感じになっているやつ
それもグローバルっすね。
もっとも定数として使われてる分には問題ないかと。 $version は定数ですけど・・・
定数はこれくらいで、他は全部変数だったり
リモホ引いておいて置くやつとか、各種状態フラグとか、、、
use strict 'vars'; が宣言をやめて、
use vars qw($version); の宣言もやめれて
sub main_bbs
{
}
なんてので囲んじゃえばローカルになる?
いちいちmy 付ける必要あり?
>>28
そうやって全部にmyをつければ一応ローカルにはなるけど、
外側のmy変数にアクセスするのはいけないらしいっすよ。 うまく行くという保障の無いものに
工数掛ける仕様になっとらんのです < わたし
うまくいく = 劇的に負荷が軽減する
という光が見えなきゃ・・・
真剣にやってもしょうがないかと、 ・ファイルハンドルは毎回ちゃんと閉じる
・グローバル変数は our で(そのリクエスト固有の情報を入れてはだめ)
use strict;
use warnings;
use sigtrap;
をつけても動くようにする。(変数初期化とか)
・サブルーチンのなかから外のmyにアクセスしてはだめ。ourはよい。
・サブルーチンのなかから外のmyで宣言された変数を書き換えるときは、サブルーチンを呼び出すときに参照を渡す。 うーん
簡単に試してみることはできなそうだな、、、
sub main_bbs
{
$xxx = ""; ←これはローカル? (stack?)
&subsub1();
}
sub subsub1
{
print "$xxx"; ← サブルーチンで親のローカルを参照できる?
}
サブルーチンに親子関係は無いです。
多分こうすれば…
sub main_bbs
{
my $xxx = "";
&subsub1($xxx);
}
sub subsub1
{
my $xxx = shift;
print "$xxx"; #書き換え不可
}
かもしくは
sub main_bbs
{
my $xxx = "";
&subsub1(\$xxx);
}
sub subsub1
{
my $xxx = shift;
print "$$xxx"; #書き換え可
} >>28
use strict 'vars';
これは特にやめる必要はないと思うです。
use vars qw($version);
これは宣言するとグローバル変数になるから、
それをやめたければ、mainでやるのはやめたほうがいいですね。
myはプライベート変数であることの宣言なんで、
サブルーチンでやるならつける必要はあるかと、 >>33
> これはローカル?
no. myかourをつければローカル。
> サブルーチンで親のローカルを参照できる?
myは不可。ourなら可。 use vars qw($version);
より
our $version;
のほうがタイプ数がs(ry Rock54リストは、ホジホジしておきたいですー@現在200KB超 とりあえずグローバルな配列かハシュを1つ作っておいて、
あとはリファレンスで操作すると、すぴでぃーの方も気持ちよくなるのかな? ところで、
実際に実験するときはどうやればいいんですか? >>41
親bbs.cgiの1行目を、
#!/usr/local/bin/speedy -- -r1 -t60 -b1048576
から、
#!/usr/local/bin/speedy -- -t60 -b1048576
にして、書き込んでみると。 >>42
それは現在のところ
dso.2ch.net だけですよね? >>44
他のtigerサーバもspeedyで動いているので、
dso.2ch.netで動作確認した後、他のtigerな掲示板サーバでも同じ要領で試せます。 >>38-39
頻度順にソーティングしていないんでしょうか。
それならば検索は早く終了するかと。 現在
#!/usr/local/bin/speedy -- -t60 -b1048576
になっとるです (>>42)
何が問題なのかな?
ついに SpeedyCGI モードで書ける所まできたー なんだか携帯からだとformの値が(送られて|受け取れて)ないみたいですね >>2-3
あまり時間が取れない状況ですが、お手伝いできるところはさせて頂きますー
と亀レス。 【 html化されたこのスレを読んでいるお前へ 】
おい、お前。そう、お前だよ。
「このスレおもろいから見てみ」「2ちゃんの歴史に残る名スレだぜ」とか言われてホイホイと
このhtml化されたスレを見にきた、お前のことだ。
どうだ?このスレおもしれーだろ。
でもな、お前はこのスレを読むだけで、参加することはできねーんだよ。
可愛そうにな、プププ。
俺は今、ライブでこのスレに参加してる。
すっげー貴重な経験したよ。この先いつまでも自慢できる。
まあ、お前みたいな出遅れ君は、html化されたこのスレを指くわえて眺めてろってこった。