1

我在 perl 中使用forkwith 。 当我正常运行它时,它会按预期打印 5 次。 但是当我在 apache 服务器中将此文件配置为快速 cgi 时,它只打印一次。 任何人都可以在这里帮助我。CGI::Fast
In handle request
In handle request

示例程序:

#!/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 $@;
}

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;
}
4

1 回答 1

1

FastCGI 常见问题解答包括专门关于如何使用 fork 或 exec 的部分?在 Perl 中。

但是,当您 fork 时,也没有调用 exec,即当您运行两个 perl 实例时,请求句柄对象将(最终)在两个 perl 实例中被销毁。因此,当对象第一次被销毁时,可能正在处理的请求将被完成。这可能不是您所期望的,因为您通常只会在父级或子级中处理请求。要阻止这种不需要的请求完成,您可以将 Detach() 消息发送到请求句柄对象。在分离状态下,销毁不会导致任何请求的完成。建议您在分叉之前调用 Detach() 并在之后调用 Attach(在将继续处理请求的过程中)。

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

于 2013-05-08T13:06:19.837 回答