2009-07-22 2 views
3

Ich versuche, CGI-Skripte zu mod_perl mit ModPerl::Registry zu migrieren.Wie füge ich einen Skript-spezifischen lib-Pfad in mod_perl hinzu?

Die Skripts verwenden Module, die sich im selben Verzeichnis wie das Skript befinden, aber da mod_perl das aktuelle Verzeichnis an anderer Stelle ist, funktioniert das nicht.

Ich versuchte FindBin mit zum @INC hinzufügen, aber hier ist es, was FindBin wie folgt aussieht:

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

, die bei nicht Gebrauch ist alles.

Also gibt es eine Möglichkeit für das Skript herauszufinden, wo es ist, und dieses Verzeichnis zu @INC hinzufügen? Idealerweise würden alle anderen Skripte, die denselben Apache-Server verwenden, dieses Verzeichnis nicht zu ihrem @INC hinzugefügt bekommen.

Antwort

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

Ich bin mir nicht sicher, ob '__FILE__' durch' mod_perl' unbelästigt bleibt. Wenn es sicher ist, dann gibt es keine Notwendigkeit für "BEGIN" & "Unshift" (außerdem sollte es nach BEGIN keinen Doppelpunkt geben. –

+1

Dies funktioniert: Verwenden Sie File :: Basenname; Verwenden Sie lib dirname (__FILE__); Ihr Vorschlag funktioniert nicht, aber es brachte mich auf den richtigen Weg. Danke. –

+0

Davids Vorschlag funktionierte nicht wegen des Doppelpunkts nach 'BEGIN' –

1

Haben Sie Location oder Directory für jedes Skript eine separate haben oder haben sie alle leben in der gleichen Stelle? Wenn der ehemalige, würde ich 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> 

Wenn letzteres verwenden:

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> 
+0

Ich nehme an, Sie tun dann etwas wie "use lib $ ENV {THISONE_LIB}"? –

+0

@Mathieu Ja. In diesem Fall ist Davids Antwort jedoch besser. –

1

Do bei lib::abs zu suchen. Es konvertiert einen relativen Pfad in einen absoluten Pfad und ist wahrscheinlich ideal für den Einsatz unter mod_perl.

2

In httpd.conf die folgende Zeile ganz weit oben:

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

Dann in startup.pl, geben Sie die erforderlichen Module, etwa so:

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

Und Presto!

+0

Das macht diese Verzeichnis global.Ich habe viele Apps, die auf dem gleichen httpd-Server laufen, würde ich das Include Dire lieber nicht mischen ctories. –

Verwandte Themen