【问题标题】:fork with CGI::Fast perl使用 CGI::Fast perl 分叉
【发布时间】:2013-05-02 16:09:28
【问题描述】:

我在 perl 中使用 forkCGI::Fast
当我正常运行它时,它会按预期打印In handle request 5 次。
但是当我在 apache 服务器中将此文件配置为快速 cgi 时,它只打印一次 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;
}

【问题讨论】:

    标签: perl fork fastcgi


    【解决方案1】:

    FastCGI 常见问题解答包括专门针对 Perl 中的 How do I use fork or exec? 的部分。

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2012-01-19
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 2015-06-26
      相关资源
      最近更新 更多