1

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" ファイルハンドラーの 3 つのエラーに興味をそそられます。

<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 環境が正常に動作していれば、これは x64 環境で得られるべきもののように聞こえます。

FCGI.pm モジュールを少し調べてみると、何らかの理由で *STDIN と *STDOUT が x64 で開かれていないことがわかりますが、その理由がわかりません。これに関するエラーはありません。だから私はアドバイスやアイデアのためにここに来ました、または誰かが以前にこの種の問題に遭遇して解決した場合、私は解決策を知りたいと思っています:)

私が行ったテストについてもう少し:

  • x64 で myapp_server.pl と myapp_cgi.pl に問題はありません。これらは問題なく動作します。
  • Perl x64 をアンインストールし、Windows 2008 R2 で x32 バージョンに置き換えても解決しません。同じ GEN2 エラーが発生します (ちなみに ActivePerl を使用しています)。
  • すべてのテストの管理者権限があり、x64 環境では UAC が無効になっています

前もって感謝します !

4

1 に答える 1

1

これにはさらにテストが必要ですが、モジュールを比較した後、XPのPlack :: Handler :: FCGIのバージョンが、ppmリポジトリで使用可能なバージョンよりも古く、サーバーとWindows7にインストールしていたことがわかります。 。

どちらのバージョンにも、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),
    );

その後の対話は、以前のように*STDxxxではなく$self->{stdxxx}を介して行われます。

最新バージョンでどのように機能するかはわかりませんが、新しいPlackモジュールFCGI.pmを古いものに置き換えると、すべてのシステムでGEN2エラーが削除されます。詳細はPlackの人に聞いてみます...

コメントありがとうございました、それは私を正しい方向に向けました。

于 2012-04-27T15:57:22.830 に答える