| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 и в логи пишется следующее:
обратите внимамение, точка включена в @INC ;-) Если я копирую Conf.pm в /usr/local/share/perl/5.8.8/ то все работает на ура. Конфиг perl в апаче выглядит так:
Можно как-нибудь сделать так, чтобы все работало, если 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 | ||
А у меня некоторое время работало в конфиге
Потом неведомо что поменялось и перестало работать. А указание полного пути добавляет ненужного узнавания его (писанины). Да и вообще, пути бывают абсолютными и относительными, и вдруг одного не стало. Не порядок. |
| Автор: BlackLFL 2.4.2008, 13:34 | ||
2GePo, попробуйте так
2tishaishii, расскажи поподробнее, после чего перестал отрабатывать PerlSwitches? |
| Автор: ginnie 2.4.2008, 13:40 |
| Уважаемый BlackLFL, Вы уверены, что $ENV{'SCRIPT_FILENAME'} будет определена, если скрипт будет компилироваться при запуске Apache? |
| Автор: BlackLFL 2.4.2008, 13:43 | ||
да уверен. Добавлено через 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 | ||
|
| Автор: 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 пишем
В файле F:\Apache\cgi-bin\test.pl пишем
(хотя она и так всегда там есть Теперь вопрос: какой, по вашему, путь скрывается за '.'? |
| Автор: 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 помещал |
| Автор: Ramirez 13.8.2008, 19:17 | ||||
| В случае с mod_perl, насколько я понимаю все пути относительно апача получаются. Что вцелом логично... Это будет либо SERVER_ROOT либо путь в системе к текущему location сайта. Можно сплясать относительно пути к текущему 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 можно еще попробовать помудрить с:
ну или хотябы посмотреть его код, может какие мысли появятся... |