我一直在尝试从使用 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 -- 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
?