如何在mod_perl中的BEGIN块中访问Apache服务器配置?

时间:2009-01-20 19:50:36

标签: perl apache2 startup mod-perl2

我一直在尝试从使用PerlSetEnv切换到使用custom configuration directives。我的配置模块包含来自docs的副本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 -- 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块中的情况属实,那我怎么能得到{{1} }}?

2 个答案:

答案 0 :(得分:0)

尝试将您想要的import函数添加到其他模块,并将use此模块添加到您通常放置BEGIN块的代码中。它应该工作相同。可能有帮助。

答案 1 :(得分:0)

部分,转储未正确使用。这样做效果更好:

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

但是,它没有显示任何出现在< Directory>范围内的指令块。

在我的特殊情况下,我不需要那个功能,第二个想法;这恰好就是我把它们困住的地方。