Январь 27, 2006

Отладка CGI-скриптов на Perl (Часть 3)

Если в вышеуказанном скрипте сделать намеренную ошибку, убрав ";" в конце предпоследней строки, то запустив его "через сервер", мы скорее всего увидим большими буквами написанное "500 Internal Server Error" (Внутренняя ошибка сервера).

А если мы запустим его "как программу", то увидим сообщение наподобие следующего:

syntax error at test.cgi line 3, near "print"
Execution of test.pl aborted due to
compilation errors.

В первой строке указано, что синтаксическая ошибка произошла в файле test.cgi, в строке 3, рядом со словом print. По-моему, довольно исчерпывающая информация! :) (во второй строке сказано, что выполнение скрипта прервано из-за ошибок компиляции).

Теперь мы ищем строку 3, оператор print и исправляем ошибку. Также довольно неприятной ошибкой, приводящей к, на первый взгляд, совершенно непонятному поведению скрипта, является пропуск закрывающей фигурной скобки (}). Чаще всего Perl определит это как ошибку компиляции, но у меня были случаи, когда ошибки не выдавалось. Вообще, все ошибки в CGI-скриптах можно, на мой взгляд, условно разделить на следующие категории:

1. Синтаксические (ошибки компиляции);
2. Ошибки взаимодействия с CGI;
3. Ошибки взаимодействия с другими программами и/или файлами;
4. Логические.

Первые ошибки удобнее всего находить описанным выше способом.

Ко вторым относится некорретный вывод скрипта: скрипт должен выводить свой ответ в формате HTTP, т.е. поля заголовка ответа, затем - пустая строка, а затем - собственно тело ответа. В описанном выше примере выводилась строка заголовка:

Content-Type: text/plain ;charset=windows-1251

затем-пустая строка - и тело ответа:

Скрипт отработал успешно! Поздравляю!

При этом сервер, получив ответ от скрипта, разбирает выданный им заголовок, добавляет в него дополнительные поля и основную строку ответа. Поэтому CGI-скрипту вовсе необязательно формировать полный заголовок. Обычно обязательным является указание поля Content-Type, но в любом случае пустая строка после заголовка обязательно должна быть

Несколько слов о так называемых nph- CGI-скриптах. Это скрипты, полностью формирующие HTTP-заголовок. Поэтому сервер не должен "разбирать" заголовки, выданные такими скриптами, а передавать браузеру все "как есть". Отсюда и название - nph (non-parsed headers - неразбираемые заголовки). Для некоторых серверов такие скрипты должны иметь определенное строение имени файла (имя должно начинаться с nph-), для других это не обязательно.

Также к ошибкам связи с CGI относится неправильное указание переменных среды CGI, а также - для скриптов, обрабатывающих формы - метода передачи данных от формы (GET или POST). При этом, если скрипт ожидает данных, посланных методом POST (на стандартный ввод), а в форме ошибочно указан метод GET, то скрипт "застрянет" - он будет ждать поступления данных на стандвртный ввод! Если же скрипт принимает данные по методу GET, а в форме указан POST, скрипт отработает, но не получит из формы никаких данных (как если бы в форме не было ни одного поля).

Для скриптов, выводящих "картинки" (GIF, JPG), характерной ошибкой является ASCII-режим передачи. Сразу после открытия файла оператором open этому файлу соответствует ASCII-режим чтения/записи, предназначенный для "простых текстов" (text/plain), как, например, текст в "блокноте".

Все файлы, которые задействованы в выводе картинки, (в том числе STDOUT !) должны быть переведены в "бинарный" режим Perl-оператором:

binary FILE;

Иначе произойдет искажение данных, поскольку он будет передаваться как текст: во-первых, произойдет замена "концов строк", во-вторых, символ с кодом 0 будет воспринят как конец файла.

К ошибкам связи с внешними программами и файлами можно отнести неверный вызов, например, UNIX-команд sendmail, date и т.п. Сюда же можно отнести и неправильный путь к Perl, записанный в первой строке после #!.

продолжение следует...

Часть 2

Часть 4

Разместил:

Автор: Андрей Черный

Комментарии

1. 14.05.07 23:50 От: Таня

Очень хорошая статья!

Ваш комментарий

Обсудить на форуме?

Подумайте, прежде чем высказать своё мнение. Постарайтесь сделать свой комментарий полезным для других. Не используйте ненормативную лексику. Пользователи, пишущие "от нечего делать" бессмысленные наборы символов, будут блокироваться навсегда.