2013-05-08 88 views
1

我在perl中使用forkCGI::Fast
當我正常運行時,它按預期打印In handle request 5次。
但是,當我將該文件配置爲apache服務器中的快速cgi時,它僅打印一次In handle request
任何人都可以幫助我。fork with CGI :: Fast perl

樣例程序:

#!/usr/bin/perl 

use strict; 
use warnings; 
use CGI::Fast; 
use Data::Dumper; 
use HTML::Template; 

while(my $query = CGI::Fast->new()) { 
    my $timeout ='60'; 

    eval { 
     local $SIG{ALRM} = sub { 
      print STDERR "Fcgi error"; 
      exit(0); 
     }; 

     alarm $timeout; 
     #wait till all the result returns 
     my $val = process_request($query); 
     alarm 0; 
    } or print STDERR [email protected]; 
} 

sub process_request{ 
    my $query = shift; 
    my @childs =(); 
    print $query->header; 

    foreach my $i (1..5) { 
     my $pid = fork(); 
     if($pid) { 
      push(@childs, $pid); 
     } 
     elsif($pid == 0) { 
      _handle_request(); 
      exit(0); 
     } 
    } 
    foreach my $child (@childs) { 
     my $pid = waitpid($child, 0); 
    } 

    return; 
} 

sub _handle_request{ 
    print "In handle request<br/>"; 
    return; 
} 

回答

1

FastCGI的常見問題包括特別是關於在Perl How do I use fork or exec?的截面。

當你叉,但是,如果沒有調用exec爲好,即當你 有運行perl的兩個實例,請求處理對象將 (最終)可以在Perl的兩個實例銷燬。因此,當第一次銷燬對象 時,將會完成正在處理的 可能的請求。這可能不是你所期望的,因爲你通常只會在父母或孩子中處理請求。要禁止這種不需要的請求完成,可以將Detach()消息發送到請求句柄對象。在分離狀態下,銷燬不會導致請求的完成。建議您在分叉之前調用Detach(),之後再進行附加(在繼續處理請求的過程中)。

可能發生的情況是,在第一個分叉子發送響應之後,它將該請求標記爲完成,並且在其他子節點發送響應之前關閉客戶端連接。