Perl 快速 CGI:你曾经退出循环吗?
Perl fast CGI : do you ever exit the loop?
考虑标准的 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 脚本时会发生什么?
通常不会,但有可能。
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 对象)return 是一个负数,它可以 return 为假。
深入了解两个 C 函数之一,称为 OS_Accept
,一个用于 unix,一个用于 Windows。它们主要是 accept
系统调用的包装器。
accept
主要是在被信号中断或进程耗尽资源(套接字或内存)时失败。大多数其他原因是代码中的错误。
考虑标准的 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 脚本时会发生什么?
通常不会,但有可能。
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 对象)return 是一个负数,它可以 return 为假。
深入了解两个 C 函数之一,称为 OS_Accept
,一个用于 unix,一个用于 Windows。它们主要是 accept
系统调用的包装器。
accept
主要是在被信号中断或进程耗尽资源(套接字或内存)时失败。大多数其他原因是代码中的错误。