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

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

于 2009-01-20T20:36:59.217 回答
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 回答