3

環境: Apache/2.2.11 (Win32) mod_apreq2-20051231/2.6.2-dev mod_perl/2.0.4-dev Perl/v5.10.0

win32 を使用していることを除いて、このディスカッション リストの投稿に記載されている状況と非常によく似ています。

私はhttpd.confにこれを持っています:

PerlModule Apache2::Reload
PerlInitHandler Apache2::Reload
PerlSetVar ReloadAll Off
PerlSetVar ReloadModules "MyPackage::*"

...および mod-perl スクリプト処理のみ。

MyPackage モジュールを使用するスクリプトがあり、動作しています。

モジュールを壊して、スクリプトをリロードします。エラーは役に立つもので、モジュールを壊した行を教えてくれます。

(この時点で再度リロードすると、最初にファイルをロードできなかったため、「Undefined subroutine &ModPerl::ROOT::ModPerl::Registry...」としか表示されません。しかし、いずれにしても、次のようになります。動作は引き続き発生します。)

ブレークを元に戻し、スクリプト ファイルにも触れて、モジュールをリロードし、リロードします。今それは言います:

Attempt to reload MyPackage/Foo.pm aborted.
Compilation failed in require at E:/dev/test.pl line 4.

また、スクリプトとモジュールに触れても、Web サーバーを再起動しない限り、正しくリロードできません。

(モジュールではなく) スクリプト自体を壊すだけでも問題なく動作します。適切なエラーが発生し、それを元に戻すと、リロード時に再び動作するようになります。

これらの各作業の後、テストする前に Web サーバーを再起動しました。

  1. トレースを試みましたが、引き続きエラーが発生するのは ModPerl/RegistryCooker.pm の 204 行目です。これは、スクリプト全体を評価する行です。{}

  2. スクリプトとモジュールで「use warnings FATAL => 'all'」を「use warnings」に変更してみました。違いはありませんでした。

  3. カスタム $SIG{__DIE__} 関数を無効にしようとしました。違いはありませんでした。(もちろん、エラーが発生した場所だけですが、生成されたエラーは同じでした。)

  4. 冒頭のディスカッション リンクによると、MaxRequestsPerChild はずっと 0 であり、ThreadsPerChild 1 を試しましたが、違いはありませんでした。MaxRequestsPerChild を 1 にしてみました。これにより、この質問の奇妙な動作が解決されますが、リクエストごとに Web サーバーが再起動されます。

    Child 7072: Process exiting because it reached MaxRequestsPerChild. Signaling the parent to restart a new child process.
    Parent: Received restart signal -- Restarting the server.
    

    ページが最初に表示されたときに実行される大量のコードがあるため、これは良い解決策ではありません。

  5. また、議論によると、私は httpd をサービスとして実行しているので、サービス パラメーター ウィンドウに -X を追加して [開始] をクリックしましたが、3 分後に完全に開始しようとしていました (通常は 3 秒以内に開始します)。メッセージ。タスク マネージャーでプロセスを強制終了し、Web ブラウザーからページにアクセスできないことを確認しました。コマンドラインから httpd -X を開始しました。この質問の上部と同じ動作です。また、httpd -? を実行したときに -X がリストされていないのも奇妙に感じました。もしかしたら、win32 MPM では利用できないのでしょうか?

  6. そのスレッドで、David は次のように述べています。

    この種の問題をトラブルシューティングした私の経験では、アンロードされたパッケージが、リロードされたモジュールのパッケージ スペースに格納された値 (おそらく BEGIN ブロック時に設定された) を削除し、その後の require が復元しなかった可能性が高いことが示されました。

    しかし、これは私のコードには当てはまりません。私が紹介する「スクリプトを壊す」というエラーは、既に存在する行の上に余分な「my $var」行を追加するだけなので、2 番目の行は既に宣言されていると不平を言います。

リロードのたびに Web サーバーを再起動せずに mod_perl2 モジュールで作業する方法はありませんか?

4

1 に答える 1