尝试在Windows x64(Win 2008 R2和Windows 7)下使用myapp_fastcgi.pl脚本时,我遇到了Calatylst的问题。
由于某些原因,当我尝试通过http服务器访问脚本时,我得到“此应用程序遇到内部错误”(我得到了IIS7.5和Apache 2.4)。试图指出问题,我在DOS控制台中运行脚本,我得到了这个:
Use of uninitialized value $value in pattern match (m//) at D:/perl/site/lib/Config/General.pm line 872.
Use of uninitialized value in concatenation (.) or string at D:/perl/site/lib/Plack/Handler/FCGI.pm line 114, <DATA> line 998.
Use of uninitialized value in quotemeta at D:/perl/site/lib/Plack/Handler/FCGI.pm line 116, <DATA> line 998.
Use of uninitialized value in string eq at D:/perl/site/lib/Catalyst.pm line 2770, <DATA> line 998.
Use of uninitialized value $host in substitution (s///) at D:/perl/site/lib/Catalyst/Engine.pm line 444, <DATA> line 998.
Use of uninitialized value $host in concatenation (.) or string at D:/perl/site/lib/Catalyst/Engine.pm line 451, <DATA> line 998.
Use of uninitialized value $host in concatenation (.) or string at D:/perl/site/lib/Catalyst/Engine.pm line 459, <DATA> line 998.
Use of uninitialized value in string eq at D:/perl/site/lib/Catalyst/Action/RenderView.pm line 51, <DATA> line 998.
binmode() on unopened filehandle GEN2 at D:/perl/site/lib/Plack/Handler/FCGI.pm line 165, <DATA> line 998.
print() on unopened filehandle GEN2 at D:/perl/site/lib/Plack/Handler/FCGI.pm line 177, <DATA> line 998.
Use of uninitialized value in string eq at D:/perl/site/lib/Catalyst.pm line 1817, <DATA> line 998.
print() on unopened filehandle GEN2 at D:/perl/site/lib/Plack/Handler/FCGI.pm line 179, <DATA> line 998.
我不介意初始化错误,因为在这种情况下,http服务器设置的大部分环境都缺失了。然而,当我在x32环境(Windows XP)下尝试完全相同的脚本时,“GEN2”文件处理程序上的三个错误引起了我的反响:
<same init errors>
Use of uninitialized value in string eq at D:/Perl/site/lib/Catalyst/Action/RenderView.pm line 51, <DATA> line 998.
Status: 302 Found
Location: http:///login
Content-Length: 292
Content-Type: text/html; charset=utf-8
Set-Cookie: myapp_session=1e5994a41ea40c41764c4f2c0dc45592ef4b520f; path=/;
expires=Wed, 25-Apr-2012 17:14:25 GMT; HttpOnly
X-Catalyst: 5.90011
Use of uninitialized value in string eq at D:/Perl/site/lib/Catalyst.pm line 1817, <DATA> line 998.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/x
html1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Moved</title>
</head>
<body>
<p>This item has moved <a href="http:///login">here</a>.</p>
</body>
</html>
这听起来更像我在x64环境中应该得到的,如果它正常工作。
在FCGI.pm模块中查看一下,提示我由于某些原因* STDIN和* STDOUT在x64下未打开,但我无法弄清楚为什么我没有关于此的错误。所以我来这里是为了任何建议或想法,或者如果有人遇到过这种问题并解决了它,我很想知道解决方案:)
更多关于我做过的测试:
提前致谢!
答案 0 :(得分:1)
这将需要进一步测试,但在模块比较后,它显示XP上的Plack :: Handler :: FCGI版本比ppm存储库上可用的版本更旧,而且我在服务器上安装了Windows 7。
两个版本都有不同的方式来打开stdin,stdout和stderr。
较旧的FCGI.pm版本(无GEN2错误):
( .. some code ..)
my %env;
my $request = FCGI::Request(
\*STDIN, \*STDOUT,
($self->{keep_stderr} ? \*STDOUT : \*STDERR), \%env, $sock,
($self->{nointr} ? 0 : &FCGI::FAIL_ACCEPT_ON_INTR),
);
新的FCGI.pm版本(GEN2错误):
( .. some code ..)
@{$self}{qw(stdin stdout stderr)}
= (IO::Handle->new, IO::Handle->new, IO::Handle->new);
my %env;
my $request = FCGI::Request(
$self->{stdin}, $self->{stdout},
($self->{keep_stderr} ? $self->{stdout} : $self->{stderr}), \%env, $sock,
($self->{nointr} ? 0 : &FCGI::FAIL_ACCEPT_ON_INTR),
);
后续互动通过$ self-&gt; {stdxxx}代替* STDxxx完成。
我不确定它是如何在最新版本中工作的,但用旧的替换新的Plack模块FCGI.pm会删除所有系统上的GEN2错误。我会问Plack的伙伴们详细...
再次感谢您的评论,它指出了我正确的方向。