昨日からテストしてるFastCGIだが、
シグナル補足できたわ。
どうも、
FCGI::Request
の6番目の引数を設定しない場合は、
シグナルきても無視して待ちつづけるみたいだ。
で、TERMきても終了しないからKILLされてるぽい。
$req=FCGI::Request(\*STDIN,\*STDOUT,\*STDERR,\%ENV,0,FCGI::FAIL_ACCEPT_ON_INTR);
こんな感じにしたらシグナルきた。
$SIG{'TERM'}
だけで良さそうか?
で、まだFastCGIの挙動がよくわかってないから怪しいが、
アクセスカウンタのサンプル
#!/usr/bin/perl
use FCGI;
open(FILE,"count.txt");
$count=<FILE>;
close(FILE);
$SIG{'TERM'}=\&ScriptEnd;
$req=FCGI::Request(\*STDIN,\*STDOUT,\*STDERR,\%ENV,0,FCGI::FAIL_ACCEPT_ON_INTR);
while($req->Accept>=0){
print "content-type:text/plain\n\n";
print ++$count;
}
&ScriptEnd;
sub ScriptEnd{
open(FILE,"+>count.txt");
print FILE $count;
close(FILE);
exit;
}
起動時にカウント値の入ったcount.txtを読み込んで$countに入れる。
接続きたらカウント+して表示。
終了シグナルきたら保存して終了。
FastCGIのプロセスを複数起動しないようにすればファイルアクセスせずにメモリで高速アクセスカウンタができる。
サーバー設定で、
FcgidMaxProcessesPerClass 1
てすれば同時起動防げるぽい。
FcgidMaxProcesses
って似たようなのもあるが、こっちは全スクリプトの最大プロセス数ぽい。
FcgidIdleTimeout
を設定すれば、設定時間経過で終了シグナルがくる。(監視間隔があるので実際にはもう少し長くなる)
んだが、
FcgidMinProcessesPerClass 0
ってやって、最小プロセス数を0にしないと、
最小プロセス数は停止せずに残っちゃうんで死んでくれない。
ちなみに、
FcgidIdleTimeoutは初期値が300で設定されてるから、それで良ければ変える必要ない。
あとは、
同時接続きた時にどうなるのか?
ってのがよくわかってないからテストしたいところ。
sleep入れて複数つなげばいいかな?