Усовершенствование и отладка PHP-приложений при помощи syslog

PHP-версия хорошо известного UNIX syslog - простое и эффективное средство отладки

Известная методика исследования выполняющейся программы требует вставки специального кода, который отображает текущие значения переменных в стратегически важных пунктах. Но как их получить, не вступая в противоречие со стандартным выводом программы? При помощи PHP-средства syslog() можно легко исследовать эти значения. Узнайте, как это сделать.

Вильям Б. Циммерли, внештатный писатель и специалист в области инженерии знаний, Author

Вильям Б. Циммерли является специалистом в области инженерии знаний, программистом систем низкого уровня, имеющим практические знания в различных версиях UNIX и Microsoft® Windows®, а также вольнодумцем, который преклоняется перед алтарем логики. Вильям также известен как неразумный человек. Неразумный в том смысле, что "Разумные люди приспосабливаются к миру сами. Неразумные же пытаются приспособить мир для себя. Весь прогресс, следовательно, зависит от людей неразумных" (Джордж Бернард Шоу). Его страсть – создавать новые технологии и писать о них. Он живет в сельской части Хиллсборо, штат Миссури, где воздух свеж, где пейзажи вдохновляют и повсюду разбросаны винные заводики. Ничто не может сравниться с тем, когда пишешь статью о скриптах оболочки UNIX, потягивая Stone Hill Blush из прозрачного бокала. Связаться с ним можно по адресу bill@zimmerly.com.



28.03.2008

Программирование - утомительное, но в то же время увлекательное занятие. Одним из увлекательных аспектов является изучение новых способов использования старых средств. Недавно меня наняли, чтобы найти ошибки в большой и сложной LAMP-системе (Linux®, Apache, MySQL, и Linux, Apache, MySQL, PHP/Perl) - системе управления содержимым (Content-Management System - CMS). Архитектура CMS представляла собой стандартную LAMP-модель на Enterprise Red Hat Linux с Apache V2.0. Код Web-сайтов состоял из нескольких сотен PHP-модулей, разбросанных по 30 подкаталогам каталога Apache document root. В Apache и MySQL изменения не потребовались, поэтому все мои усилия были сосредоточены на PHP.

Потратив много времени на изучение работы CMS и оценив ее изящество, я понял, что в самой зрелой программной среде эта система использовала лишь небольшое количество доступных PHP-функций (здесь бал правят тени старого правила 80/20 - 80% работы выполняется при помощи 20% доступных функций). В данной статье демонстрируется, как процесс отладки неизвестной сложной системы помогает узнать о малоиспользуемых функциях, а также приводятся примеры применения этих новых знаний в использовании богатых возможностей функции syslog().

Под микроскопом

Язык программирования PHP насчитывает буквально сотни функций, но некоторые (смею ли сказать, большинство?) никогда не используются, пока о них не прочтут в таких статьях, как эта. Другой способ узнать больше о языке состоит в том, чтобы отлаживать программы, которые написали на нем другие люди. Меня всегда впечатлял творческий подход программистов к использованию инструментария.

Отладка, как и программирование, частью наука, частью искусство. Отыскивая неочевидные ошибки в системе, созданной не вами, нужно обладать отличным чутьем, чтобы найти их в коде. Имея дело с сотнями модулей, правильно было бы начать с того места, где в выходной информации обнаруживается ошибка, а затем идти обратным ходом, чтобы локализовать проблему.

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

Известная методика состоит в том, чтобы вставить код, который просто выводит эти строки и значения. К сожалению, работая с такими инструментами, как PHP или любые Web-приложения, можно замусорить естественную выходную информацию системы (т.е. HTML-код, посылаемый в браузер) отладочной информацией, особенно если исследуемая система является работающим сервером.

Можно было бы создать регистрационный файл и записывать в него отладочную информацию, но почему не использовать уже предоставленные вам инструменты? Помните: не стоит хоронить инструменты. Время, потраченное на изучение уже предоставленных авторами языка библиотек подпрограмм или функций в поисках нужной вам функции, - правильно потраченное время. Фактически, всегда чувствуется, когда что-либо должно очевидно быть частью программного пакета, и так оно, скорее всего, и есть.

Я понял, что нужная мне функциональность должна походить на syslog UNIX®. Я подумал, что в PHP могла бы быть функциональности syslog, поэтому быстро просмотрел документацию по PHP и нашел ее! Я не замечал PHP-функцию syslog() много лет, пока меня не пригласили в этот проект. При помощи syslog() я смог определить и устранить большинство ошибок в работающей системе без побочных эффектов, не считая незначительного времени, необходимого для выполнения каждой функции.

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

Применение функции syslog() позволяет взять сложность под контроль и обеспечивает дополнительное преимущество - удобные настройки при помощи конфигурационных файлов, таких как syslog.conf. Например, можно вставить код для форматирования SQL-утверждения, записи его в syslog() и передачи в MySQL для выполнения. Затем небольшая модификация файла syslog.conf пошлет текст в другой системный журнал или, возможно, просто в битоприемник. Недели или месяцы спустя, если опять потребуется увидеть, что случилось, еще одно простое изменение в файле syslog.conf восстановит функциональность.


syslog

В мире UNIX у syslog богатая и яркая история. Разработанный первоначально как часть проекта Sendmail, syslog оказался настолько полезным, что в его функциональность было включено много других инструментов; тем самым было доказано, что иногда наиболее простые идеи являются наиболее мощными.

Коротко говоря, syslog позволяет приложениям записывать помеченные сообщения в общий набор системных журналов, которые могут храниться там, где это наиболее удобно для программистов и сетевых администраторов. Это означает, например, что можно настроить syslog на Web-сервере на запись системных сообщений на другой сервер, который, возможно, находится на несколько уровней глубже (за брандмауэрами), и к нему легче получить доступ. Но для моих целей достаточно поведения по умолчанию файлов, записываемых в каталог /var/log.

Механизм syslog запускает программа начального пуска, а его исходное поведение определяется правилами в файле syslog.conf. Данные правила позволяют точно указать, что может, а что не может быть записано механизмом - это дает возможность при больших нагрузках на сервере получать файлы журналов приемлемых размеров.

Каждое правило состоит из двух полей: селектора (selector) и действия (action). Селектор указывает, какие сообщения будут регистрироваться (например, ядра, пользователя, почты, принтера), а также приоритет. Поле приоритета содержит ключевые слова, такие как debug (отладка), info (информация), notice (уведомление) или warning (предупреждение). Поле действия определяет, что делать с сообщениями, соответствующими содержимому селектора. Правила могут определять файл для записи сообщения, механизм отправки регистрируемого сообщения, отправившего сообщение пользователя (в виде консольных сообщений) и т.д.


Запись информации

Изучите информацию и руководства по syslog, чтобы настроить систему в соответствии со своими требованиями. В моем случае нужно было знать значения различных PHP-переменных в разное время выполнения CMS. Кроме того, я должен был знать, когда были запущены и остановлены различные модули, а также значения различных промежуточных переменных. Прежде чем приступить к специфическим подробностям, давайте осуществим настройку.

Создайте в вашем любимом редакторе файл, приведенный в листинге 1, назовите его test.php и разместите там, где находится ваш Apache document root (на моей системе это /var/www).

Листинг 1. test.php
<html>
  <head>
    <title>PHP Test Page</title>
  </head>
  <body>
    <?php
	syslog(LOG_NOTICE, "{$_SERVER['REMOTE_ADDR']}: 
	test.php - PHP Index page accessed.");
	echo '<p>PHP Test Page</p>';
    ?>
  </body>
</html>

Также у вас должен быть установлен и настроен PHP. Если это не так, обратитесь к разделу "Ресурсы", где приведены ссылки на источники информации о том, как это сделать. Если все настроено надлежащим образом, при обращении к странице http://localhost/test.php вы должны увидеть в браузере следующий текст:

PHP Test Page

Теперь откройте окно X-терминала и введите следующую команду, чтобы увидеть, что было записано в файл /var/log/messages:

tail /var/log/messages

Если все прошло хорошо, в конце листинга вы должны увидеть следующую строку:

Jul 23 14:43:42 localhost apache2: 127.0.0.1: test.php - PHP Index page accessed.

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

Я нашел хороший способ использования syslog() для всех вызовов PHP/MySQL, так что всякий раз, взаимодействуя с Web-сайтом, вы сможете видеть в режиме реального времени, какие сгенерированы SQL-запросы для построения возвращаемой вам страницы. Удобный способ сделать это состоит в том, чтобы открыть дополнительное окно X-терминала и использовать команду tail с параметром -f для просмотра "вживую" журнала сообщений:

tail -f /var/log/messages

Что записывать

Теперь, когда вы убедились, что запись информации работает и можно увидеть результаты ее работы, я дам несколько советов, как сократить процесс изучения незнакомой системы, поскорее начав использовать данные инструменты.

Важно знать, какие модули делают что-то сверх того, что написано в документации. Поэтому я люблю записывать сообщения, отмечающие начало и конец модулей. Таким образом, можно поиграться со страницами Web-сайта, наблюдая за дополнительным окном X-терминала, где выполняется команда tail -f /var/log/messages. Вы увидите, какие модули выполняются, а также в каком порядке каждый раз браузер запрашивает новую страницу.

Я также люблю регистрировать границы между различными программами, вызываемыми в процессе выполнения PHP-кода. Например, когда сделаны MySQL-запросы или вызваны внешние программы, изменяющие форматирование данных (Extensible Stylesheet Language Transformation (XSLT) механизмы, к примеру). Практика систематического размещения таких контрольных точек в коде каждого модуля поможет привыкнуть к названиям и местоположению модулей. В то же самое время, когда код отправляет сообщения, отображаемые в дополнительном X-терминале, вы просматриваете различные страницы, имея, таким образом, важную обратную связь, облегчающую и углубляющую ваше понимание системы.


Заключение

Средство syslog - мощный инструмент для отладки приложений, написанных не вами. Он позволяет наблюдать, какие модули и SQL-утверждения выполняются, а также значения каких переменных изменяются, когда вы ходите по Web-сайту. Это помогает точно определять модули, в которых, вероятно, имеются проблемы.

Ресурсы

Научиться

  • Оригинал статьи "Refine and debug PHP applications with syslog" (EN).
  • Узнайте больше о функции syslog().(EN)
  • Исследуйте историю syslog на Wikipedia.(EN)
  • PHP.net - основной ресурс для PHP-разработчиков.(EN)
  • Просмотрите "Рекомендованный список PHP-литературы".(EN)
  • Просмотрите PHP-контент на developerWorks.
  • Усовершенствуйте свои PHP-навыки - просмотрите ресурсы PHP-проекта на IBM developerWorks.(EN)
  • Прослушайте интересные для разработчиков программного обеспечения интервью и дискуссии на developerWorks podcasts.(EN)
  • Используете с PHP базу данных? Познакомьтесь с Zend Core for IBM - цельной, "коробочной", легко устанавливаемой PHP-средой разработки, поддерживающей IBM DB2 V9.(EN)
  • Следите за техническими событиями и web-трансляциями на developerWorks.(EN)
  • Следите за проходящими по всему миру конференциями, выставками, web-трансляциями и другими событиями, которые могут представлять интерес для разработчиков программного обеспечения IBM с открытыми исходными кодами.(EN)
  • Посетите раздел Open source на developerWorks, чтобы получить исчерпывающую информацию how-to, инструментальные средства и обновления проекта, которые помогут вам вести разработку при помощи технологий с открытыми исходными кодами и использовать их с продуктами IBM.
  • Изучайте IBM-технологии и технологии с открытыми исходными кодами, а также возможности продуктов, при помощи демонстрационных материалов developerWorks On demand demos.(EN)

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=298308
ArticleTitle=Усовершенствование и отладка PHP-приложений при помощи syslog
publish-date=03282008