問題タブ [mod-perl2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - PerlLogHandler のパフォーマンスへの影響を判断するにはどうすればよいですか?
カスタム Apache2 ログ ハンドラーを作成したいのですが、Apache サイトにあるテンプレートは次のとおりです。
群れのパフォーマンス コストはどれくらいですか? このロギング プロセスは、HTTP 要求と並行して行われますか、それとも順次行われますか? 並行して、パフォーマンスはそれほど重要ではありませんが、ユーザーがこのようなものを追加するためにさらに一瞬待つ必要はありません。
winapi - 一貫して再現可能なmod_perl2/$SIG{__DIE__}バグのトラブルシューティングに役立ちます
これは、Apache 2.2ではmod_perl2、win32ではActiveStatePerl5.10です。
$SIG{__DIE__}
DBIのRaiseErrorフラグをオーバーライドしてオンにします。これは、データベース呼び出しが失敗したときに、ドキュメントのAFAICTがオーバーライドを呼び出す必要があります。ある場合を除いて、ほとんどの場合そうですが、その理由がわかりません。
私のスクリプトにはour $page
変数があり、mod_perl2であるため、次のようにオーバーライドからこれを取得できます。
これは正常に機能します。さて、その中$page
に、DBから戻ってきたときに何か別のことをしたい「許可された」エラー値の配列参照があります。$r->print
DBがこれらのエラーの1つをスローした場合、それをJSONのユーザーフレンドリーなメッセージに変換し、実行を停止します(動作A)。何らかの理由で、代わりにスクリプトに制御を戻します(動作B)。
これが私のスクリプトの主要部分です:
最初の行をコメントアウトすると、通常のエラー(予期しない処理)(動作C)が発生します。これは、発生しているエラーを許可されたエラーのリストに追加していないためです。本当に奇妙なのは、その最初の行を切り取って$SIG{__DIE__}
オーバーライドに貼り付けると、それが機能することです。JSON応答がオーバーライドされ、出力され、{test}
割り当てられる前に実行が停止します(動作A)。見知らぬ人でも、{allowed}
任意の数値セットに設定できます。特に「22007」が含まれている限り、動作Bが発生します。含まれていない場合は、動作Cが発生します。さらに奇妙なことに、実際にオーバーライドを埋めることができます。何でも(警告、への呼び出しCORE::die
、など-コンパイルする限り)そして私はまだ振る舞いBを取得します-オーバーライドにはそれを可能にするコードが含まれていなくても!warn
また、とへの呼び出しの期待される結果が得られずCORE::die
、ログが沈黙しているだけなので、オーバーライドを介して実行パスを手動で追跡することさえできません。
スクリプトを保存するたびにApache2.2を再起動しました。オーバーライドをスクリプト自体と同じスクリプトファイルに移動し、通常のモジュールから外し、モジュールファイル全体をコメントアウトして、再起動しました。
その最初の行を削除するか、「22007」を削除するwarn
とdie
、好きなものをすべて手動でデバッグでき、すべてが期待どおりに機能します。サーバーがリセットされても何も出力されない「22007」についてはどうでしょうか。翻訳マップを除いて、プロジェクト全体のどこにも「22007」への参照はありません。そのファイルから完全に削除して再起動すると、結果に違いはありません。それはあたかもその日の早い段階から私のオーバーライドをキャッシュしたかのように振る舞い、決して忘れることはありません。ランダムなクエリ文字列を追加でき、結果も変わらないため、ブラウザのキャッシュの問題でもありません。
これは私が今までに経験した中で最も奇妙で最も苛立たしいmod_perl2の経験であり、私はアイデアを使い果たしました。誰かヒントはありますか?私が考えることができる唯一のことは、それがキャッシングの問題であるということです、それでも私はサービスを数え切れないほど再起動しました。
一日の終わりだったので、サーバーコンピュータを完全に再起動してみようと思いましたが、それでも何も変わりませんでした。サーバーを再起動する前に、{state}
これに割り当てられている唯一の行を変更しました。
それでも、その後の出力は{test}
「22007」でした。これは、私がそのままにしておいた場合にのみあるはず= $errno
です。
たとえば、キャッシングを実行するリバースプロキシであったとしても、要求が異なる可能性があるため、この状況は私には意味がありません。サーバーを完全に再起動した後も、コードに存在しない値を割り当てるにはどうすればよいでしょうか。つまり、$SIG{__DIE__}
完全に再起動した後、ファイルに存在しなくなった古いオーバーライドをどのように使用できるでしょうか。
更新: 許可されたエラーを「42601」に変更し、db呼び出しをに変更しようとしました'select'
。これにより、そのエラーコードが生成されますが、変換マップには追加されませんでした。それでも動作Bが得られ、「42601」に設定{state}
されているため、「22007」に固有のものではありません。に入れられたエラーコードは{allowed}
、そのエラーが実際に発生した場合、古いバージョンのオーバーライドを実行しています。にないエラーが発生し{allowed}
、現在のバージョンが実行されます。{allowed}
しかし、オーバーライドに到達する前に、現在のエラーがにあるかどうか、またはそれが何かを意味するかどうかをどのように知るのでしょうか?{allowed}
(オーバーライドは、現在のエラーに対してgrepされる唯一の場所であるためです。)
perl - mod_perl2 の startup.pl で DOCUMENT_ROOT を学習するにはどうすればよいですか?
startup.pl で DOCUMENT_ROOT を学びたいのですが、私にできる最善の方法は、server_root を学ぶことです。
これはまったく役に立たない。環境変数を設定できます
しかし、可能であれば、余分な構成は好きではありません。
他の方法で DOCUMENT_ROOT を取得する方法はありますか?
perl - mod_perl2 で Devel::Cover を実行するにはどうすればよいですか?
残念ながら、Devel::Cover
スレッドではまだ動作しません。
プリフォークでも動作しません。
で、問題use
_startup.pl
Devel::Cover
パール 5.8.9、アパッチ 2.2.13。私の OS は FreeBSD です。についても同じ問題が報告されていwin32
ます。
更新:ここに出力がありますPerlTrace all
perl - アクティブ状態の Perl - IOCP
ネットワーク関連のコードの 1 つで、perl の IOCP を使用することを考えています。現在アクティブな状態の Perl は 5.10 まではこの機能を提供していませんか? perl で IOCP のような ASIO 機能を使用するための無料のモジュールを知っている人はいますか?
-カーシック
winapi - mod_perlified変数のダンプ-ローカル名前空間は何ですか?
私はmod_perlスクリプトを持っています:
死ぬundef at C:/www/test.pl line 8.
私は期待していました"ugly" at C:/www/test.pl line 8.
代わりに私が
...キャッシュされた変数をクリアするためにサービスを再起動した後、face
リストされていません。
die
このコードが最後に使用したときに機能していることを誓ったかもしれません...特定のローカル変数を取得してデバッグ情報をダンプできるように、ローカル変数に名前を付けるこの方法の周りにフック全体を書きました。
ローカル名前空間は何ですか?
perl - Apache は Macports Perl5.8.9 で CGI を実行しません
Apache 2 macports インストールで perl を実行しようとしています。経験豊富な perl オタクが助けてくれることを願っています。私は...
- Apache をダンディに実行しました。Macports は perl5 プレースホルダーと perl5.8.9 でそれをインストールしました。
- mod_perl2 をインストールしました。
- スクリプトを実行して httpd.conf を構成します。
- Apacheを再起動しました。
htdocs に次のテスト スクリプトを記述します。
/li>
私が得るのは、画面に出力されたスクリプトの内容だけです。手順がありませんか?.conf ファイルで行う必要がある追加の構成はありますか?
perl - mod_perlにバッファメモリを再利用させる方法はありますか?
mod_perlで実行されているPerlスクリプトがあり、クライアントに大量のデータを、場合によっては長期間にわたって書き込む必要があります。私が観察する動作は、何かを印刷してフラッシュすると、バッファメモリが再利用されないことですrflush
(これはOSによって再利用できないことを知っています)。
それはmod_perlの動作方法であり、定期的にバッファメモリを解放するように強制して、OSからより多くを取得する代わりに、新しいバッファに使用できるようにする方法はありますか?
明確にするために、私は自分でバッファを使用しておらず、コードにリークはありません。次の簡単な例を考えてみましょう。
これはひどくリークし、私のリクエストは存続しているので、何日もアクティブになる可能性があります。
perl - mod_perl2 の下で Apache::DBI で fork を使用する安全な方法は何ですか?
子プロセスで Apache::DBI を使用すると問題が発生します。問題は、Apache::DBI がそれを使用するすべてのプロセスに対して単一のハンドルを提供することです。
DBD::mysql::db selectall_arrayref が失敗しました: コマンドが同期していません。/usr/local/www/apache22/data/test-fork.cgi 20 行目でこのコマンドを実行することはできません。
次のエラーを理解したので、Apache::DBI はすべてのプロセスで再接続するため、再接続は役に立ちません。
サーバーで内部エラーが発生し、リクエストを完了できませんでした。
エラー メッセージ: DBD ドライバーは、/usr/local/lib/perl5/site_perl/5.8.9/Apache/DBI.pm 行 283 で AutoCommit 属性を実装していません。
元のコードは次のとおりです。
再接続に使用したコード:
fork で Apache::DBI を安全に使用する方法はありますか? おそらく新しい接続を作成する方法はありますか?
perl - mod_perl2 の下で fork するのは悪い考えですか?
mod_perl2 の下で fork することに対する反対意見はありますか? mod_perl2 でバックグラウンド プロセスを実行するには、別の方法を使用する必要がありますか?