下面是一个示例脚本:
#!/usr/bin/perl
use FCGI;
my $request = FCGI::Request();
while($request->Accept() >= 0) {
die "test";
}
根据 FCGI 规范,我希望这会在 Apache 错误日志中打印“测试” ,但实际上什么也没有发生。如果我将骰子移到 while 循环的外部和前面,则会将消息打印到错误日志中。
有关 Apache 配置的更多信息,此行用于配置处理程序:
Addhandler fcgid-script .fcgi
我被告知 suexec 正在使用中并充当 fcgi 包装器。
编辑:
FCGI.pm 本身提出了部分解决方案:
默认情况下没有安装 die 和 warn 处理程序。这意味着如果您没有运行启用了 sfio 的 perl,则默认情况下,任何警告或死亡消息都不会最终出现在服务器的日志中。建议您自己设置模具并警告处理程序。FCGI.pm 包含一个 die 和 warn 处理程序的示例。
因此,我以这种方式尝试过:
#!/usr/bin/perl
use FCGI;
use IO::Handle;
my ( $stdin, $stdout, $stderr ) = ( IO::Handle->new, IO::Handle->new, IO::Handle->new );
my $request = FCGI::Request( $stdin, $stdout, $stderr );
my $err_handler = sub { print {$stderr} @_ };
while($request->Accept() >= 0) {
$SIG{__WARN__} = $SIG{__DIE__} = $err_handler;
warn "test1";
die "test2";
}
出现test2
在我的错误日志中没有任何问题,但是test1
没有。