28.5. Стратегии отладки
Бывают случаи, когда кодирование приводит к самым неожиданным результатам, а изучение кода не дает никаких результатов. В таком случае лучше всего произвести построчную отладку. Сценарии PHP генерируют HTML-код, который интерпретируется браузером, и HTML-код снабжается тегом комментария. Поэтому проще всего написать PHP-код, который бы сообщал диагностическую информацию в HTML-комментариях. Это позволит поместить диагностическую информацию в сценарии, не виляя на его работу.
Часто приходится создавать динамические запросы к базе данных на основании данных, вводимых пользователями. Неправильный символ или ошибочный пользовательский ввод может привести к ошибке. Иногда следует оставлять возможность для ввода самого запроса. Кроме того, можно выводить результаты работы функций, формирующих сообщения об ошибках (mysql_error). Тоже справедливо и для кода, не имеющего отношение к работе с базами данных. Распечатка даже таких простых диагностических сообщений, как "попали туда-то", может помочь. (В главе 9, "Операционная система", описывалось множество функций, имеющих отношение к процессу отладки, особое место среди которых занимает функция print_r.)
Можно долго искать ошибки в созданном приложении, включив отображение всех ошибок, сообщений и уведомлений. Сообщения и уведомления не могут остановить ваши сценарии, но они могут предупредить о потенциальных проблемах. Посмотрим, как PHP позволяет использовать переменную для ее инициализации. Если в имени переменной содержится ошибка, PHP создает новую переменную с пустым значением. PHP генерирует уведомление об использовании значения переменной до ее инициализации. Проще всего активизировать уведомления в конфигурационном файле php.ini , предполагая, что Web-сервер полностью предназначен для поддержания работ по разработке приложений. Промышленно используемый Web-сервер не должен отображать сообщения об ошибках. Но полное диагностирование ошибок можно включить с помощью функции error_reporting.
Есть еще один способ - фиксирование диагностических сообщений в специальном системном журнале. Функции error_log и syslog представляют собой два решения, встроенных в PHP. Конечно, несложно открыть текстовый файл и записывать в него диагностическую информацию. При использовании Web-сервера Apache для передачи отладочной информации процессу Apache и включения ее в регистрационный журнал можно воспользоваться функцией apache_note. О том, как создаются специальные ре­гистрационные журналы, можно узнать в документации по Web-серверу Apache.
Наконец, есть еще несколько инструментов, предназначенных для отладки сценариев PHP. Например, Zend Studio имеет удаленный отладчик, позволяющий прослеживать работу каждой строки сценария.
28.6. Имитация HTTP-соединений
При написании сценариев PHP необходимо понимать каждую деталь HTTP-протокола. Я не хочу углубляться в эту тему и лишь отмечу, что умение сымитировать HTTP-соединение с помощью утилиты telnet может пригодиться в дальнейшем. Вы, конечно, знаете, что Web-сервер по умолчанию использует порт 80. HTTP-протокол - это текстовый протокол, поэтому можно подключиться с помощью утилиты telnet непосредственно к Web-серверу и выполнить простой запрос. HTTP-протокол имеет несколько общеизвестных команд, но чаще всего используются команды GET и POST. Команда HEAD возвращает только заголовок запроса, и браузеры с ее помощью могут определить, требуется ли в действительности целый документ.
Имитация HTTP-соединений может очень помочь при отправке сценарием адаптируемых заголовков. На рис. 28.3 показан запрос, сделанный к Web-серверу Apache. Жирным шрифтом выделена вводимая команда, все остальное - это информация, которую возвратил сервер.
Эффективность и отладка