2012-09-21 37 views
1

我正在構建一個mod_perl網站,我需要設置一個將在Perl代碼中使用的環境變量。爲什麼Apache PerlModule指令不設置自定義環境變量?

直到現在我用的是PerlSetEnv指令設置該變量:

PerlSetEnv MYVAR myvalue 

    <LocationMatch /perlpath/> 
     SetHandler modperl 
     PerlResponseHandler myhandler 
     Header set Cache-control "no-cache" 
    </LocationMatch> 

這工作得很好,但我想我的預加載mod_perl處理器,因爲第一個電話是很慢的。所以我改變了我的Apache虛擬主機文件:

PerlSetEnv MYVAR myvalue 
    PerlModule myhandler   <- add this line 

    <LocationMatch /perlpath/> 
     SetHandler modperl 
     PerlResponseHandler myhandler 
     Header set Cache-control "no-cache" 
    </LocationMatch> 

但如果我這樣做,預壓myhandler的時候,我的代碼失敗,我自定義的環境變量MYVAR未設置。

那麼是否可以設置一個環境變量,將由PerlModule指令導出?

+0

我找到了解決我的問題的方法:將我的變量作爲我的處理程序的模塊參數傳遞並通過自定義導入函數獲取。這就是說,我仍然對任何解決方案感興趣,以便在預加載時設置ENV變量。 –

回答

1

您可以使用PerlPassEnv將env變量轉發到在服務器中運行的程序。然而,它們在apache請求週期的第一階段生效,與setEnv & PassEnv不同,直到修復階段才生效。

在過去,我使用BEGIN子句來設置像ORACLE_HOME這樣的env變量,我希望在請求階段之前就可以看到它。

嘗試在httpd.conf中的perl BEGIN塊內設置變量,這可能比傳統指令更多地暴露它。

+0

正是我想要的。我應該想到自己使用BEGIN條款! –

0

也許你必須在虛擬主機配置中移動setenv?

<LocationMatch /perlpath/> 
    SetHandler modperl 
    PerlSetEnv MYVAR myvalue 
    PerlResponseHandler myhandler 
    Header set Cache-control "no-cache" 
</LocationMatch> 
+0

我試過了,但沒有奏效。我不認爲這是變量範圍的問題。 –