Как я могу получить доступ к конфигурации сервера Apache в блоке BEGIN в mod_perl? - PullRequest
1 голос
/ 20 января 2009

Я пытался перейти от использования 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;
    }
}

... который вызывается каждой пользовательской директивой sub. Тогда у меня в .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 -- Restarting и автоматическому перезапуску Apache. Если я передаю 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?

Ответы [ 2 ]

0 голосов
/ 21 января 2009

Частично, дамп не используется правильно. Это работает лучше:

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

Однако, он не показывает никаких директив, которые появляются в блоках.

В моем конкретном случае, однако, мне не нужны эти функции, если подумать; это просто случилось, где я их застрял.

0 голосов
/ 20 января 2009

Попробуйте добавить то, что вы хотите для функции import, в другой модуль и use этот модуль в коде, где вы обычно ставите блок BEGIN. Это должно работать так же. Может быть, это помогает.

...