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


Автор: UncleAndy 12.1.2011, 00:12
Система CentOS - apache 2.2.3+mod_perl 2.0.4, perl 5.8.8 штатные.
Для сайта использую Template Toolkit 2.22

В непредсказуемые моменты один или несколько процессов httpd (отследил через $$) начинают вести себя странно.
У меня есть процедура которая обрабатывает данные и выдает шаблоны - do_template($apache_rec, $karkas, $params, $only_return). Параметры - переменная apache request из mod_perl, имя шаблона, параметры шаблона, флаг определяющий что делать с результатом компиляции шаблона - если 0 - сразу выводить, если 1 - возвращать его.

Для отладки понаставил строк типа
open(LOG, '>>/tmp/dbg.log'); print LOG 'do_template: 0', "\n"; close(LOG);
и дождался глюка.

Результат поставил меня в тупик. Во время глюков процедура, которая вызывает данную отрабатывает нормально, а вот запись в лог из самой процедуры (ставил строку даже перед получением параметров процедуры) НЕ происходит. Кроме того, при последнем параметра = 1 производится странное действие, такое как будто этот параметр == 0. Процедура возвращает 1 и выводит шаблон в STDOUT.

В чудеса я не верю, но не могу понять в чем проблема. Если навскидку не распознаете ситуацию, подскажите хотя-бы какими средствами можно ее попробовать отладить.

Автор: Leshak 13.1.2011, 13:02
Цитата(UncleAndy @  12.1.2011,  00:12 Найти цитируемый пост)
В чудеса я не верю


ситуация знакомая - неоднократно попадал в такое
однозначно определить причину не смогу, но это может происходить из-за разного
если не путаю - то дольше всего искал причину оказавшейся пропущенным знаком препинания запятой или точкой с запятой..
из моих любимых ошибок:
- корявость в регулярном выражении
- неаккуратность  с глобальными/локальными данными 
- в том числе - ошибки в именах!

в таких случаях мне помогают 
- отладочные выводы после каждой строки кода
- заглушки 
- заново переписать код

вот...
Успехов

Автор: UncleAndy 13.1.2011, 13:16
Пока нашел только путаницу с именами переменных. Внутри процедуры использовал локальную переменную с таким-же именем как и глобальная. Пока грешу на это. Буду смотреть повториться-ли ошибка.

Автор: srl 17.1.2011, 00:02
Цитата(UncleAndy @ 12.1.2011,  00:12)
Кроме того, при последнем параметра = 1 производится странное действие, такое как будто этот параметр == 0.

Хм-м, эта фраза наводит на размышления.

Осознаёшь ли ты, чем работа скрипта под mod_perl отличается от обычного CGI? Так же, осознаёшь ли ты, что по дефолту запущено несколько процессов веб-сервера, и каждый из них может выполнять разные версии скрипта (пока ты вносишь изменения, не перезапуская веб-сервер)?

Автор: UncleAndy 17.1.2011, 11:11
Цитата(srl @ 17.1.2011,  00:02)
Осознаёшь ли ты, чем работа скрипта под mod_perl отличается от обычного CGI? Так же, осознаёшь ли ты, что по дефолту запущено несколько процессов веб-сервера, и каждый из них может выполнять разные версии скрипта (пока ты вносишь изменения, не перезапуская веб-сервер)?

Осознаю конечно. С такими скриптами несколько лет работал на довольно крупном проекте. Просто сейчас совсем уж непонятное происходит (если не учитывать то что нашел дублирование имен переменных).

Кстати, еще такой вопрос, связанный с предыдущим.

Если у меня есть две версии сайта - основная и тестовая и в них используется библиотека подключаемая по required, не может-ли их апачь путать из-за того что у них одно имя package (но находятся они в разных каталогах). Может это конечно и ложная тревога, но последние глюки натолкнули на эту мысль.

Автор: srl 20.1.2011, 07:27
Цитата(UncleAndy @  17.1.2011,  11:11 Найти цитируемый пост)
Если у меня есть две версии сайта - основная и тестовая и в них используется библиотека подключаемая по required, не может-ли их апачь путать из-за того что у них одно имя package (но находятся они в разных каталогах). Может это конечно и ложная тревога, но последние глюки натолкнули на эту мысль. 


Эх, и всё-таки не понимаешь ты, как работает mod_perl, даже не смотря на опыт. 8))
При чём тут вообще апач?..
"Путать" будет. Как только модуль загрузится в первый раз - его название появится в хеше %INC, и при следующем HTTP-запросе (учитывая, что процесс mod_perl'а остаётся в памяти) интерпретатор увидит, что у него этот модуль уже загружен, и этот модуль заново читать и компилировать уже не станет.

Смени хендлер запросов на PerlRun и посмотри, есть ли ошибки.

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