Perl fast CGI:你有没有退出循环?

时间:2017-09-28 21:05:33

标签: perl fastcgi

考虑标准的Perl快速CGI脚本:

#!/usr/bin/perl

use CGI::Fast;

# Init handler

while (my $cgi = CGI::Fast->new) 
{
# Handle request
}

# Do you ever get here?

我是否曾退出循环并有机会进行清理?

当服务器因为超出时间限制而抛出test.fpl脚本时会发生什么?

1 个答案:

答案 0 :(得分:3)

不正常,但有可能。

CGI::Fast::new是:

sub new {
    my ($self, $initializer, @param) = @_;

    if ( ! defined $initializer ) {
        $Ext_Request ||= _create_fcgi_request( $in_fh,$out_fh,$err_fh );
        return undef unless $Ext_Request->Accept >= 0;
    }
    CGI->_reset_globals;
    $self->_setup_symbols(@CGI::SAVED_SYMBOLS) if @CGI::SAVED_SYMBOLS;
    return $CGI::Q = $self->SUPER::new($initializer, @param);
}

如您所见,如果$Ext_Request->Accept(其中$Ext_Request是FGCI :: Request对象)返回负数,则返回false。

向下钻取我们到两个名为OS_Accept的C函数之一,一个用于unix,一个用于Windows。它们主要是accept系统调用的包装器。

accept如果被信号中断或者进程耗尽资源(套接字或内存),则主要会失败。大多数其他原因都是代码中的错误造成的。