1

PerlSetEnv の使用からカスタム構成ディレクティブの使用に切り替えようとしています。set_valドキュメントからのコピーを含む構成モジュールがあります。

sub set_val
{
    local our ($key, $self, $parms, $arg) = @_;
    $self->{$key} = $arg;
    unless ($parms->path)
    {
        local our $srv_cfg = Apache2::Module::get_config($self, $parms->server);
        $srv_cfg->{$key} = $arg;
    }
}

...すべてのカスタム ディレクティブ サブルーチンによって呼び出されます。次に、.conf に次のように記述します。

PerlLoadModule MyModule::ServerConfig
MyCustomDirective 'hello'

これは、 httpd -t がファイルの構文を許可するという点でうまく機能します。問題は、BEGIN ブロック内から構成ファイルの値を取得できないように見えることです。これを行う必要があります。

私はあらゆる種類のものをいじってみました:

BEGIN
{
    use Apache2::CmdParms ();
#   use Apache2::Directive ();
    use Apache2::Module ();
#   use Apache2::ServerUtil ();
#   use Apache2::RequestUtil ();

    use Data::Dump;
    warn ddx(Apache2::Module::get_config('MyModule::ServerConfig', Apache2::CmdParms->server));
#   warn ddx(Apache2::Directive->as_hash);
#   warn Apache2::ServerUtil->dir_config('MyCustomDirective);
#   warn Apache2::CmdParms->server->server_hostname();
}

...しかし、役に立たない。私の努力のほとんど(CmdParms->serverたとえばアクセスしようとする)の結果、Parent: child process exited with status 3221225477 -- RestartingApacheが自動的に再起動されます。私が合格した場合ServerUtil->server to get_config()、サーバーは存続しますが、警告は「1」のみを出力します。

BEGINリクエストはさまざまであるため、ブロック内でリクエストに関連するものを取得できないためであるとどこかで読みました。PerlOptions +GlobalRequest を使用し$ENVてブロック内で見ることができたことを除いて、それはある程度理にかなっていBEGINますが、リクエストがどのように発生するかに依存しているのと同じように、自分のディレクティブを見ることができないのはなぜですか? 特に紛らわしいのは、 に渡そうとするとApache2::RequestUtil->request->per\_dir\_config()、ブロック内でそれが真である場合、どうすれば に到達できるかというget_config()ことGlobal $r object is not available. です。BEGIN$ENV

4

2 に答える 2

0

部分的に、Dump が正しく使用されていません。これはよりうまく機能します:

use Data::Dump qw(pp);
warn pp(Apache2::Module::get_config('MyModule::ServerConfig', Apache2::ServerUtil->server));

ただし、 <Directory> ブロック内に表示されるディレクティブは表示されません。

ただし、私の特定のケースでは、考え直して、その機能は必要ありません。それはたまたま私がそれらを立ち往生させた場所です。

于 2009-01-20T21:14:38.407 に答える
0

通常ブロックを配置するコード内importの他のモジュールとこのモジュールに機能させたいものを追加してみてください。同じように動作するはずです。役立つかもしれません。useBEGIN

于 2009-01-20T20:36:59.217 に答える