2

かなり大きなコードベースを古代のPerl5.005.03CGI環境からmod_perl2に移植したばかりですが、パブリックベータが行われているため、時々発生する問題がいくつかあります。これらは、サーバーを再起動する必要があるまで蓄積されます。

すべてのコードはstrictを使用してコンパイルされますが、以前はコンパイル、実行、および破棄されたCGIスクリプトとして呼び出されていました。これまでに発生した問題:古いスタイルのグローバルファイルハンドル(ではなく)を使用した設定$|または呼び出し。また、パブリックベータを開始した直後に、ポート80と443でリッスンしている/ bin/tailや/usr/ sbin / sendmailを見つけたため、サーバーの再起動が停止しました。それ以来、純粋なPerlメソッドを使用するようにそのコードを書き直しましたが、その問題はもうありません。STDOUT->autoflush(1);open(ERRORFILE, $errorfile)open(my $fh_error, $errorfile)system()

2つの問題が残っています。1つ目は、ログがmod_perlでいっぱいで、定数が再定義されたことについて不平を言っていることです。

Constant subroutine ModPerl::ROOT::ModPerl::PerlRun::usr_local_..._cgi_forgotpassword::O_CREAT redefined at /usr/lib/perl5/ModPerl/Util.pm line 69.

また、一見コア変数がゴミ箱に入れられることもあります。コアの社内モジュールの1つは、スクリプトのPIDと名前に関する情報をログに記録し、次のような情報を生成します。

20090202-233948-32154:Started script /usr/local/.../cgi/account/renewalcalendar
20090202-233948-32154:Ended script /usr/sbin/apache2

それ以外の場合、プロセスIDは最終的に。になりundefます。これはまれで断続的です。

次に、断続的に、ガベージコレクションが開始されないことがあります(おそらく弱参照の問題ですか?しかし、ほとんどの場合、すべてが正常に機能します)。これの最も直接的な症状は、データベースハンドルが開かれ、閉じられないことです。しかし、この問題を深く掘り下げると、標準のPerlハッシュオブジェクトにDBIオブジェクトが格納されており、そのオブジェクトのDESTROYメソッドが(まれに、断続的に)呼び出されないことが明らかになります。

Debian 5.0(Lenny)、Perl 5.10.0、Apache 2.29、mod_perl 2.0.4、openSSL0.9.8gを実行しています。必要に応じてもっと情報を提供することもできますが、それが基本だと思います。

/ etc / apache2 / sites-enabled / * sitename*であるapacheconfigの重要な部分は、次のとおりです(機密保持の理由で一部編集されています)。

<VirtualHost ...:443>
<Directory />
    Options SymLinksIfOwnerMatch
    AllowOverride None
</Directory>
<Directory /usr/local/.../cgi>
    SetHandler perl-script
    PerlResponseHandler ModPerl::PerlRun
    PerlOptions +ParseHeaders
    Options +ExecCGI
</Directory>
</VirtualHost>

いくつかのSSL、書き換え、リダイレクトが行われていますが、それは重要なことです。

これは誰にも馴染みがあるように聞こえますか?あるいは、問題をさらにデバッグする方法を誰かが推奨できますか?

4

1 に答える 1

2

あなたの記憶の問題のために:あなたはweakenを呼び出す必要があります(標準モジュールScalar :: Utilから)

于 2009-02-03T01:14:22.940 に答える