2009-07-22 68 views
3

我正在嘗試使用ModPerl::Registry將CGI腳本遷移到mod_perl如何在mod_perl中添加腳本特定的lib路徑?

腳本使用與腳本位於同一目錄中的模塊,但由於mod_perl當前目錄位於其他位置,因此不起作用。

我試着用FindBin對添加到@INC,但這裏是FindBin樣子:

$FindBin::Bin: /usr/sbin 
$FindBin::Script: httpd 

這是沒有用的。

那麼,腳本有辦法找出它在哪裏,並將該目錄添加到@INC?理想情況下,所有其他使用相同Apache服務器的腳本都不會將該目錄添加到@INC

回答

5
use File::Basename; 
use lib dirname(__FILE__); 
+0

我不確定`__FILE__`是否仍然被`mod_perl`解開。如果安全,那麼就不需要'BEGIN'和'unshift'(此外,BEGIN之後應該沒有冒號。 – 2009-07-22 14:44:45

+1

這個作品: 使用File :: Basename; 使用lib dirname(__FILE__); Your建議不起作用,但它讓我走上了正確的軌道 謝謝。 – 2009-07-22 14:45:03

+0

大衛的建議沒有工作,因爲`BEGIN`後冒號。 – 2009-07-22 14:46:34

1

你有每個腳本一個單獨的LocationDirectory,還是他們都住在同一個地方?如果是前者,我會用PerlSetEnv

Alias /apps/thisone/ /srv/http/site/apps/thisone/ 
<Location /apps/thisone/> 
    SetHandler perl-script 
    PerlResponseHandler ModPerl::Registry 
    PerlOptions +ParseHeaders 
    PerlSetEnv MYLIB /srv/http/site/apps/thisone/lib 
    Options +ExecCGI 
    Order allow,deny 
    Allow from all 
</Location> 

如果是後者:

Alias /apps/ /srv/http/site/apps/ 
<Location /apps/thisone/> 
    SetHandler perl-script 
    PerlResponseHandler ModPerl::Registry 
    PerlOptions +ParseHeaders 
    PerlSetEnv THISONE_LIB /srv/http/site/apps/thisone/lib 
    PerlSetEnv THATONE_LIB /srv/http/site/apps/thisone/lib 
    Options +ExecCGI 
    Order allow,deny 
    Allow from all 
</Location> 
1

待辦事項看lib::abs。它將相對路徑轉換爲絕對路徑,可能是在mod_perl下使用的理想選擇。

2

在httpd.conf添加以下行靠近頂部:

PerlRequire /location/of/this/script/startup.pl

然後在startup.pl,指定所需要的模塊,像這樣:

use lib qw(/location/of/module1 /location/of/module1); 1;

和Presto!

相關問題