Как мне добавить специфичный для скрипта путь к библиотеке в mod_perl?

Я пытаюсь перенести сценарии CGI в mod_perl с помощью ModPerl::Registry,

Скрипты используют модули, которые находятся в том же каталоге, что и скрипт, но так как mod_perl текущий каталог находится в другом месте, это не работает.

Я пытался с помощью FindBin добавить к @INC но вот что FindBin похоже:

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

Что бесполезно.

Итак, есть ли способ для сценария выяснить, где он находится, и добавить этот каталог в @INC? В идеале, все остальные сценарии, использующие тот же сервер Apache, не добавят этот каталог в свои @INC,

4 ответа

Решение
use File::Basename;
use lib dirname( __FILE__ );

В вашем httpd.conf добавьте следующую строку ближе к началу:

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

Затем в файле startup.pl укажите необходимые модули, например:

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

И Престо!

Посмотрите на lib:: abs. Он преобразует относительный путь в абсолютный путь и, вероятно, идеально подходит для использования в mod_perl.

У вас есть отдельный Location или же Directory для каждого сценария или они все живут в одном месте? Если первый, я бы использовал 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>
Другие вопросы по тегам