+!!!Parallel::ForkManagerを使ったフォーク技
+
+ついでにLWPx::TimedHTTPとか使って時間とてみる。
+
+参考リンク
+[CPAN (Parallel::ForkManager)|http://search.cpan.org/dist/Parallel-ForkManager/]
+[CPAN (LWPx::TimedHTTP)|http://search.cpan.org/dist/LWPx-TimedHTTP/]
+[perldoc.jp (Parallel::ForkManager)|http://perldoc.jp/docs/modules/Parallel-ForkManager-0.7.5/ForkManager.pod]
+
+[Parallel::ForkManager|http://search.cpan.org/dist/Parallel-ForkManager/]は使い勝手がいい。
+依存モジュールも少ないし、基本置けば動くはず。自分でforkさせるよりラクチン。
+[LWPx::TimedHTTP|http://search.cpan.org/dist/LWPx-TimedHTTP/]は時間とるのに便利だす。
+
+例によてサンプル。
+
+{{code Perl,4,
+#! /usr/bin/perl
+use strict;
+use warnings;
+use LWP;
+use LWPx::TimedHTTP qw(:autoinstall);
+use Parallel::ForkManager;
+my $pm = new Parallel::ForkManager(3000);
+my $url = 'http://localhost/test.pl';
+foreach my $i ( 1..10 ) {
+ $pm->start and next;
+ my $ua = new LWP::UserAgent;
+ my $response = $ua->get($url);
+ print "#########\n";
+ print $response->header('Client-Request-Connect-Time'),"\n";
+ print $response->header('Client-Request-Transmit-Time'),"\n";
+ print $response->header('Client-Response-Server-Time'),"\n";
+ print $response->header('Client-Response-Receive-Time'),"\n";
+ print "#########\n";
+ $pm->finish;
+}
+$pm->wait_all_children;
+}}
+
+!!!普通のフォーク技
+
+[Parallel::ForkManager|http://search.cpan.org/dist/Parallel-ForkManager/]は便利だども、使えないこともありえるので、通常のfork技をば。
+
+!!コマンドラインでよい場合
+
+{{code Perl,4,
+#!/usr/local/bin/perl
+if($pid=fork){
+ # 親プロセスをここに記載
+ print "prosecc start\n";
+ exit(0);
+}elsif(defined $pid){
+ # 子プロセスをここに記載
+ sleep(100);
+ open(FH ,">>./test.log");
+ print FH "prosecc end\n";
+ close(FH);
+}else{
+ # 子プロセスの処理に失敗したとき
+ die "error\n";
+}
+}}
+
+!!CGIとかでforkさせたいとき
+
+{{code Perl,4,
+#!/usr/local/bin/perl
+# バッファリング制御
+$|=1;
+if($pid=fork){
+ # 親プロセスをここに記載
+ print "Content-type: text/html;charset=EUC-JP\n\n";
+ print "process start\n";
+}elsif(defined $pid){
+ # 子プロセスをここに記載
+ close(STDOUT);
+ close(STDIN);
+ close(STDOUT);
+ sleep(60);
+ open(FH ,">>./test.log");
+ print FH "prosecc end\n";
+ close(FH);
+}else{
+ # 子プロセスの処理に失敗したとき
+ die "error\n";
+}
+}}
+
+{{category Perl,nolink}}