2009-01-20 23 views
1

我一直在嘗試從使用PerlSetEnv切換到使用custom configuration directives。我有一個從文檔的set_val副本我的配置模塊:如何訪問mod_perl中的BEGIN塊中的Apache服務器配置?

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 okays文件的語法。問題是,我似乎無法從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,我已經能夠在BEGIN塊內看到$ENV,所以爲什麼我不能看到自己的指令,就像它們對請求發生的依賴一樣?特別令人困惑的是,如果我試圖通過Apache2::RequestUtil->request->per\_dir\_config()get_config(),它說Global $r object is not available.如果在BEGIN塊中的確如此,我怎麼能在$ENV

回答

0

部分,轉儲未正確使用。這工作得更好:

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

然而,這並不表明出現<目錄>塊內的任何指令。

不過,在我的特殊情況下,我不需要第二個想法的功能;那恰好是我卡住他們的地方。

0

嘗試添加你想要的功能import功能到其他模塊和use這個模塊代碼你通常把BEGIN塊。它應該一樣。可能會有所幫助。

+0

對不起,我不確定你的意思是什麼...... – Kev 2009-01-20 20:56:25

相關問題