Январь 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 От: Таня
-
Очень хорошая статья!