【发布时间】:2013-01-11 21:20:06
【问题描述】:
如下是一个示例脚本:
#!/usr/bin/perl
use FCGI;
my $request = FCGI::Request();
while($request->Accept() >= 0) {
die "test";
}
我希望这会将“测试”打印到 Apache 错误日志 as per FCGI spec,但实际上什么也没有发生。如果我将骰子移到 while 循环的外部和前面,则会将消息打印到错误日志中。
有关 Apache 配置的更多信息,此行用于配置处理程序:
Addhandler fcgid-script .fcgi
我被告知 suexec 正在使用中并充当 fcgi 包装器。
编辑:
FCGI.pm itself提出了部分解决方案:
默认情况下不安装 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 没有。
【问题讨论】:
-
所以
die如果移动到while 循环之外就可以工作了吗?那么,显而易见的答案是您的 while 条件永远不会为真。即$request->Accept()永远不是>= 0。 -
不,不是这样。如果我用一个简单的打印替换 while 循环中的骰子,然后用浏览器点击它,结果是预期的。
-
我很困惑。模具在哪里工作?
-
直接在while循环之前。
-
从 FCGI::Request 文档中,您可以在创建对象时指定错误文件。 search.cpan.org/~skimo/FCGI-0.67/FCGI.PL
标签: perl apache error-logging fastcgi