Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > mod_perl и use из текущей директории.


Автор: GePo 8.2.2008, 23:32
Никак не пойму в чем дело:
Настроена Apache2+mod_perl2. Есть два файла - script.pl, Conf.pm. В script.pl делается use Conf;
Если Conf.pm лежит в одной директории с script.pl, то при вызове script.pl (через HTTP запрос) выскакивает Internal Server Error и в логи пишется следующее:

Код

Can't locate Conf.pm in @INC (@INC contains: . /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl . /etc/apache2) at /var/www/facs/script.pl line 6.\nBEGIN failed--compilation aborted at /var/www/facs/script.pl line 6.\n


обратите внимамение, точка включена в @INC ;-)

Если я копирую Conf.pm в /usr/local/share/perl/5.8.8/ то все работает на ура.

Конфиг perl в апаче выглядит так:
Код

PerlModule ModPerl::Registry

<Files *.pl>
    AddHandler perl-script *.pl
    PerlSendHeader On
    PerlHandler ModPerl::Registry

    Options +ExecCGI
</Files>


Можно как-нибудь сделать так, чтобы все работало, если Conf.pm находится в той же директрии, что и script.pl?

Автор: ginnie 9.2.2008, 14:23
Уважаемый GePo, почитайте http://perl.apache.org/docs/2.0/user/handlers/server.html#Startup_File. Обратите внимание на use lib, лучше явно указать путь к модулям и не рассчитывать на .

Автор: GePo 9.2.2008, 16:17
Неужели нет способа не указывать абсолютный путь. Это я читал, но переспектива указывать полный путь к скрипту совсем не радует.

Автор: ginnie 9.2.2008, 21:55
GePo, т.к. "." в @INC есть, а модуль не находится, следовательно текущей является не директория, в которой расположен script.pl (это легко проверить в скрипте). Вариантов решения два: первый Вы уже попробовали - разместить Conf.pm в одной из папок, перечисленных в @INC. Второй вариант - добавить в @INC папку, в которой расположены script.pl и Conf.pm. Добавлять можно тоже двумя способами: на первый я уже указал - явно добавлять полный путь в файле конфигурации Apache, второй способ - в script.pl получать полный путь, добавлять его в @INC, после этого загружать Conf.pm.

P.S. GePo, чем Вас так не радует указание полного пути к директории с Conf.pm? Меня и моих коллег такой подход вполне устраивает.

Автор: tishaishii 14.2.2008, 15:41
А у меня некоторое время работало в конфиге 
Код
PerlSwitches -I "lib/Modules"

Потом неведомо что поменялось и перестало работать.

А указание полного пути добавляет ненужного узнавания его (писанины). Да и вообще, пути бывают абсолютными и относительными, и вдруг одного не стало. Не порядок.

Автор: BlackLFL 2.4.2008, 13:34
2GePo, попробуйте так
Код

#!/usr/bin/perl

BEGIN 
{
    chdir( ( $ENV{'SCRIPT_FILENAME'} =~ /(.+)\/[^\/]*$/ ) );
    # либо воспользуйтесь модулем CWD
}

use Conf;


2tishaishii, расскажи поподробнее, после чего перестал отрабатывать PerlSwitches?

Автор: ginnie 2.4.2008, 13:40
Уважаемый BlackLFL, Вы уверены, что $ENV{'SCRIPT_FILENAME'} будет определена, если скрипт будет компилироваться при запуске Apache?

Автор: BlackLFL 2.4.2008, 13:43
Цитата(ginnie @ 2.4.2008,  14:40)
Уважаемый BlackLFL, Вы уверены, что $ENV{'SCRIPT_FILENAME'} будет определена, если скрипт будет компилироваться при запуске Apache?

да уверен.

Добавлено через 58 секунд
проверял неоднократно под apache 1.3, 2.0, 2.2, с mod_perl и без него.

Автор: BlackLFL 2.4.2008, 14:13
к сожалению, мое утверждение "да уверен", неверно, ginnie имел ввиду, будет ли доступен хэш %ENV в скрипте при загрузке сервере Apache, например, через директиву PerlRequire в файле httpd.conf.

В данном случае хэш %ENV действительно не будет доступен, но автору это не повредит, т.к. работа с файлом происходит после загрузки сервера.

Автор: tishaishii 5.4.2008, 14:12
Код

<Perl>
#И пышы что тебе надо в конфиге апачи.
# $ErrorLog='/var/log/apache2/error'
# $Location->{'/perl'}={
   $PerlHandler=>ModPerl::RegistryBB
};
</Perl>

Автор: tolkien 7.4.2008, 17:09
Такая дериктова абсолютно ясно говорит где еще искать модули PERL кроме стандартной деректории.
use lib qw(.); 

Если она не работает, а такое вполне возможно. То значит PERL на серваке обрезанный. С ограничениями.  Или сам PERL не корректно работает. 


Автор: ginnie 7.4.2008, 17:26
Уважаемый tolkien, не могли бы Вы внести ясность по поводу того, что такое "стандартная деректория" и где именно ищутся модули при использовании указанной Вами директивы?

Автор: tolkien 7.4.2008, 18:18
стандартные директории это те что были созданы при установки PERL 

F:\Perl\lib
F:\Perl\site\lib

когда подключаешь модуль

use URI;

PERL Начинает искать его в этих директориях

В добавок к ним можно подключить еще директории в которых нужно вести поиск. Это делается директивой 

use lib gw(путь_к_каталогу);

. - точка означает текущий с исполняемым скриптом каталог

Если исполняемый скрипт у тебя лежит в каталоге F:\Apache\cgi-bin\ то тогда здесь еще будет идти поиск модулей


Автор: ginnie 7.4.2008, 18:36
Уважаемый tolkien, конкретизирую вопрос:

в httpd.conf пишем

Код

<Perl>
    require F:\Apache\cgi-bin\test.pl
</Perl>


В файле F:\Apache\cgi-bin\test.pl пишем 

Код

use lib qw(.);


(хотя она и так всегда там есть   smile)

Теперь вопрос: какой, по вашему, путь скрывается за '.'?

Автор: tolkien 7.4.2008, 18:58
Все что я выше писал. Относится к CGI программированию. А не ко всяким извращениям. Вроде включений скриптов в конфиг апач.




Автор: nitr 7.4.2008, 20:50
Так вроде mod_perl обсуждали или что-то путаю... ;)
Я пользовался методом от BlackLFL.
А вот от tishaishii ответ интересный, надо затестить.
Многоуважаемый tishaishii, и вы этим пользовались?

Автор: BlackLFL 8.4.2008, 10:40
2tishaishii, расскажи поподробнее, после чего перестал отрабатывать PerlSwitches?
2tolkien, в данном топике обсуждалась работа с mod_perl, к сожалению, Ваш ответ никак не поможет в решение поставленного вопроса.

Автор: tishaishii 30.4.2008, 13:12
Я этим пользуюсь регулярно для конфигурирования апачи. Неплохо бы почитать справку по mod_perl, там много интересного. Не знаю почему перестало работать. А может я тогда нужную папку в PATH помещалsmile)

Автор: Ramirez 13.8.2008, 19:17
В случае с mod_perl, насколько я понимаю все пути относительно апача получаются. Что вцелом логично...
Это будет либо SERVER_ROOT либо путь в системе к текущему location сайта. Можно сплясать относительно пути к текущему location. Но это если все скрипты и модули лежат внутри сайта.

А если использовать конструкцию типа:
Код

<Location />
    SetHandler perl-script
    PerlInitHandler MyModule
</Location>


то, в этом случае ни '.' ни $ENV{SCRIPT_FILENAME} не прокатывает, т.к. будут указывать всегда в папку соответствующую текущему локейшену веб-сайта, например в /usr/local/www/apache22/data/.

Но модуль-то физически может распологаться где угодно, и как раз обычно он лежит вне сайта (в /home/username/MyProject/MyModule.pm например).

Единственный способ который приходит в голову -  perl_require:
в момент исполнения скрипта perl_require,  SCRIPT_FILENAME содержит правильный путь до скрипта, а не в корень сайта.
И если скрипт perl_require знает относительный путь от себя до папки с модулями, то он может добавить их в @INC.

ЗЫ: Но путь к самому скрипту perl_require  надо опять указывать полностью, так что погоды это особе не меняет =\

PPS  можно еще попробовать помудрить с:

Код

use FindBin;
use lib "$FindBin::Bin/../lib";


ну или хотябы посмотреть его код, может какие мысли появятся...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)