2013-05-08 86 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(),之后再进行附加(在继续处理请求的过程中)。

可能发生的情况是,在第一个分叉子发送响应之后,它将该请求标记为完成,并且在其他子节点发送响应之前关闭客户端连接。