1

mod_perl 2 で作成している Web アプリがあります (これはカスタム ハンドラー モジュールであり、レジストリや perlrun スクリプトではありません)。サーバーの初期化時に、できれば構成ファイルから設定したい構成オプションがいくつかあります。私が抱えている問題は、アプリの構成ファイルのファイル名を渡すのに適した場所が見つからないことです。

最初に「./app.conf」をロードしようとしましたが、現在のディレクトリはモジュールの場所ではないため、予測不能でエラーが発生しやすくなります。または、何らかのパス (相対パスまたは絶対パス) を想定する必要があります。これは柔軟性がなく、ホスト OS ディストリビューションが変更された場合に問題になる可能性があります。パスをハードコーディングしたくありません (ただし、他に良い方法がない場合は、/etc 内の何かが許容される場合があります)。

PerlSetVar も試しましたが、値はリクエスト時まで利用できません。これは実行可能ですが、子 (スレッド) の初期化ごとに少なくとも 1 回はディスクから構成ファイルを読み取る可能性があることを意味します。サーバーの初期化時にロードし、子が作成されたときに生成された環境の一部である不変の静的ハッシュを使用したいと考えています。

config.pl を使用することを検討しましたが、これは、app.conf ファイルの場所を構成するための 1 つのオプションを含む config.pl を使用するか、オプション自体を config.pl に移動してエンドユーザーに Perl を尊重するよう要求することを意味します。オプションを設定するときの構文。将来のユーザーは内部管理者になるので、それは不合理ではありませんが、私が望むよりも複雑です.

それで、私は何が欠けていますか?良い代替案はありますか?

4

1 に答える 1

0

通常、最優先事項は、実行可能ファイルの中に構成ファイルが含まれないようにすることです。そうしないと、サーバーの設定ミスにより、プライベートな設定情報が誤って世界に表示される可能性があります. アプリに必要なものはすべて の下に置き/srv/app0、サブディレクトリcfgは実行可能ファイルを含むディレクトリの兄弟です。(詳細はこちら)

PerlPostConfigRequire startup.plアクセスを介してモジュールをプリロードしている場合はmod/startup.pl、構成ファイルの場所を配置するのに最適な場所で../cfg/app.cnfあり、構成をメモリに保存する方法について完全な柔軟性があります。別の方法はPerlModule、モジュールを使用して、BEGINそれらのいずれか内のブロックに構成を (上記のように相対パスで) ロードすることです。

通常、構成ファイルの処理にはそれほど時間がかからないため、一般的なオプションは遅延ロードです。構成が欠落していることをコードが検出した場合、続行する前にそれをロードします。コードがそれより前に構成を知る必要がある場合、それは役に立ちませんが、特にコードを非 modperl 環境に移行する場合に、多くの問題を回避できます。

于 2011-11-03T13:52:30.153 に答える