6

大量の Perl コードを含む先史時代の Web サイトを維持する必要があります。新しいサーバーに移動した後、状況があいまいになりました。

同じクライアントからの複数のリクエストが 1 つのページで実行されている場合 (GD を使用して画像を生成している場合)、それらのスクリプトは互いの変数を上書きし、奇妙な結果につながります。

簡単な回避策として、Apache で MaxRequestsPerChild=1 を設定しました。

リクエストを分離する方法はありますか? 私を助けることができるmod_perlまたはApacheパラメータはありますか?

アパッチ:

Server version: Apache/2.2.15 (Unix)
Server built:   Apr  3 2014 23:56:16
Server's Module Magic Number: 20051115:25
Server loaded:  APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)

パール -v

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

これに対する解決策は大歓迎です:)


編集: mod_perl で問題を修正する適切な方法が見つかりませんでしたが、次の回避策が機能します。

  • mod_perl を無効にする
  • mod_cgi を有効にする
  • AddHandler cgi-script .pl
  • suEXEC を無効にする

suEXEC が有効になっているときに「スクリプト ヘッダーの早期終了」が発生したため、最後の 1 つは必要でした。

4

1 に答える 1

0

いいえ、「リクエストを分離する」ためにできることは何もありません。単一の Perl インタープリター プロセスで実行されるすべてのスクリプトは同じ環境を共有し、mod_perl の下ではその環境は永続的です。それらを独自のサブルーチンでラップし、名前空間の問題の一部を排除する必要がある場合は、それらを実行するように設定することができModPerl::Registryますが、スクリプトが永続性を念頭に置いて作成されていない場合 (*)、少なくともある程度は変更する必要があります。

http://perl.apache.org/docs/2.0/user/intro/start_fast.html#Registry_Scripts

また、スクリプトが SOAP::Lite などの特定のモジュールを使用している場合にも問題が発生する可能性があります。これは、それを使用するすべてのモジュールで共有されるグローバルな状態を持ちますが、これは非常にまれな問題です。

残念ながら、スクリプトを変更せずに正常に動作することを保証するためにできることは何もありません。うまくいく人もいれば、うまくいかない人もいます。別の mod_perl サーバーに加えて通常の Apache CGI サーバーをセットアップし、徐々にそれらを移行する必要があります。通常の CGI サーバーではパフォーマンスが得られませんが、問題も発生しません。

(*) 特に、これは何ヶ月も前の記憶からのものであり、グローバル変数の設定を避け、常に で変数を宣言しmy、リクエストのやり取りに CGI モジュール (または mod_perl API) を使用する必要があります。

于 2014-07-16T14:30:24.603 に答える