![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| infarch |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Возникла странная проблема с require. Когда из консоли выполняю тестовую функцию то все отлично. Под апачем выдает ошибку Cant locate Docia/Tools/Test/TestAAA.pm in @INC. Вот скрипт:
Я не могу использовать use, так как сайт запускается на линуксе и под виндой. Под виндой надо подключать Win32 модули которых на линуксе нет. Поэтому я работу с ними вынес в Docia::Tools::Test::TestAAA и подключаю его через require если это винда. Но вот под апачем проблема. Помогите пожалуйста разобраться! |
||||||
|
|||||||
| alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 1 Всего: 14 |
удалил, невнимательно прочитал.
Добавлено через 4 минуты и 53 секунды Попробуйте в use lib относительный путь указать. Где лежат модули и какой home у апача? Это сообщение отредактировал(а) alezzz - 1.10.2012, 16:44 |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Возможно дело в переменной окружения PERL5LIB которую апач не передает, или в том что под апачем путь к скрипту и проету различается, насколько я знаю в винде для апача часто делают отдельный диск.
Посмотрите массив @INC, в нем лежат все пути, по которым perl ищет модули, и найдите, где ошибка. Это сообщение отредактировал(а) Logo - 1.10.2012, 21:50 |
|||
|
||||
| infarch |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Позвольте мне вкратце описать архитектуру. Имеется апач+мод_перл. Все запросы обрабатывает controller.pl. Запрос включает в себя команду по которой определяется пакет и функция, после чего эта функция выполняется. Все скирпты расположены в папке /bb_projekt/docia/perl/lib, на которую контроллер ссылается в первой строке: use lib ("/bb_projekt/docia/perl/lib"); Тут подключаются многие модули проекта и все работает хорошо. Но вот если в каком-либо обработчике я посмотрю @INC, то в нем уже нет пути к моим библиотекам, вместо него просто точка (.)
Ну и понятно что require не может найти нужный модуль. Куда могла дется библиотека из инка? Не понимаю... Вот краткая иллюстрация работы:
Далее, допустим команда обрабатывается в Docia::MyModule::func();
Уже и не знаю что думать ( |
||||
|
|||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Может дело в eval? Почему бы не обойтись без него
|
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Без eval нельзя. Там не ссылки на функции, а просто строки:
|
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Просто строки тоже должны работать, во всяком случае с no strict 'refs';
|
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Кто же стрикт отключает? Не вариант.
|
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
При необходимости все отключают. Никто ведь не заставляет отключать его во всём скрипте, обычно это делают так
В любом случае стоит проверить решает ли это проблему. |
|||
|
||||
| Logo |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
eval не нужен
Либо так, как описал Pfailed.
Точка означает рабочую директорию
Странно... Посмотрите, где изменяется значение @INC. С помощью команды отладчика w или модулей вроде Tie::Watch, Tie::Trace. |
||||||
|
|||||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Logo, ваш вариант работает. Действительно, можно обойтись без eval. Это само по себе хорошо, никогда его не любил. Но вот в работе require это ничего не изменило. Инк дальше теряет либу.
Так что я пошел другим путем, и таки опять через eval: eval "require Win32" в контроллере. По крайней мере это не убивает сервер под линуксом и помогает под виндой. Но я нашел куда прописать либу чтоб она была постоянно доступна. Это startup.pl который запускается через PerlRequire "c:/mod-perl/Apache2/conf/startup.pl" в perl.conf который в свою очередь прописан в конфиге апача: <IfModule mod_perl.c> Include conf/perl.conf </IfModule> Когда я добавил туда библиотеку, INC стал таким как надо. Но... в продукции мне править глобальные настройки вебсерверов не дадут без крайней необходимости. Так что буду жить с eval'ным костылем. Спасибо за содействие, закрываю тему. |
|||
|
||||
| Logo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Я и не говорил, что это поможет от изменения @INC в программе:)
Когда заранее известен код, который нужно выполнить, используйте блочный eval
Это работает быстрее (не нужно заново вызвать компилятор) и помогает от ошибок компиляции в eval блоке. |
||||
|
|||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
||||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |