Perl fast CGI:您是否退出过循环?

Perl fast CGI:您是否退出过循环?,perl,fastcgi,Perl,Fastcgi,考虑标准Perl fast CGI脚本: #!/usr/bin/perl use CGI::Fast; # Init handler while (my $cgi = CGI::Fast->new) { # Handle request } # Do you ever get here? 我是否曾经退出循环并有机会进行清理 由于超过了时间限制,服务器抛出test.fpl脚本时会发生什么情况?正常情况下不会,但这是可能的 CGI::Fast::new是: sub new {

考虑标准Perl fast CGI脚本:

#!/usr/bin/perl

use CGI::Fast;

# Init handler

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

# Do you ever get here?
我是否曾经退出循环并有机会进行清理


由于超过了时间限制,服务器抛出test.fpl脚本时会发生什么情况?

正常情况下不会,但这是可能的

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\u Request->Accept
(其中
$Ext\u Request
是一个FGCI::Request对象)返回一个负数,它可能返回false

深入研究将使我们看到两个C函数中的一个,称为
OS\u Accept
,一个用于unix,一个用于Windows。它们主要是
accept
系统调用的包装器


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

如果您想进行清理,我想您可以在
END
块中进行清理。@simbabque您确定在服务器刷新Perl解释器实例及其所有运行脚本时会执行END块吗?我不确定。可能吧。试试看。你能创建fcgi请求失败并返回undef吗?如果$Ext\u请求未定义,expr$Ext\u Request->Accept>=0是否为false?它可以引发异常,但不能返回未定义。//不,这将是一个致命的运行时错误。