framework.zend.com
Stable релиз 2.0 / 1.12

Zend Framework и FirePHP

К комментариям

Содержание

Эта статья является переводом заметки Сhristoph Dorn - FirePHP and Zend Framework 1.6, с моими дополнениями.

Расширение FirePHP

FirePHP это расширение для известного отладчика Firebug. FirePHP отлавливает содержимое HTTP-заголовков X-FirePHP-Data, в котором и содержится необходимая отладочная информация. В отдельной вкладке Firebug эту информацию можно увидеть в приятном для глаз виде. От разработчика требуется подключить php библиотеку FirePHP и с помощью ее интерфейса производить необходимое логирование на сервере. По-простому FirePHP - это альтернатива классическим print_r и var_dump.

Начиная с версии 1.6 в Zend Framework появилась поддержка FirePHP! Это значит, что у поклонников браузера Firefox появилась возможность производить логирование в Firebug консоль, не скачивая никаких дополнительных PHP файлов, например библиотеку FirePHPCore.

На текущий момент Zend Framework поставляет две основных компоненты, это Zend_Log_Writer_Firebug и Zend_Db_Profiler_Firebug. Эти компоненты могут быть использованы как с Zend Framework MVC так и без. Мы рассмотрим вариант, использующий Zend Framework MVC, то есть предполагается использование Zend_Controller_Front.

Установка Firebug и FirePHP

Нам необходимо установить Firebug и FirePHP расширения для Firefox.

https://addons.mozilla.org/ru/firefox/addon/1843 - Firebug
https://addons.mozilla.org/ru/firefox/addon/6149 - FirePHP

Логирование в FirePHP с помощью Zend_Log

Логированние в Zend Framework реализовано в виде компоненты Zend_Log, которая производит логирование с помощью зарегистрированных "логгеров". Zend_Log_Writer_Firebug как раз и есть такой "логгер", из названия, очевидно, что для логирования он использует Firebug.

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

$logger = new Zend_Log();
$writer = new Zend_Log_Writer_Firebug();
$logger->addWriter($writer);

Для сохранения экземпляра "логгера", можно воспользоваться следующим кодом:

Zend_Registry::set('logger',$logger);

"Логгер" установлен и готов к использованию. Теперь вы можете запустить диспетчеризацию и логировать данные в контроллерах, моделях, скриптах вида, используя следующий код:

$logger = Zend_Registry::get('logger');
$logger->log('Это тестовая отладочная информация!', Zend_Log::INFO);

Если все сделано корректно, в Firebug консоли вы увидите сообщение "Это тестовая отладочная информация". Если вы его не видите, убедитесь что в Firebug Net и Console панели включены (По умолчанию они отключены).

Константа Zend_Log::INFO передаваемая в метод log() определяет приоритет логируемой информации. Для увеличения приоритета можно использовать, например, Zend_Log::WARN или Zend_Log::ALERT, это соответствует предупреждению и ошибке соответственно (при этом изменяются стили отображения информации в Firebug, в частности иконка).

Для логирования текста без использования какой-либо иконки можно использовать Zend_Log::DEBUG.

Особенно полезным FirePHP становится при логировании сложных данных, например многомерных массивов или объектов. Все что вам нужно это передать объект, который вы хотите логировать в метод log(), указав при этом приоритет.

К примеру, вы можете логировать исключения, имеющие сложные трейсы, с помощью кода:

try {
// Code that may throw an exception
} catch(Exception $e) {
Zend_Registry::get('logger')->err($e)
}

Заметьте что метод err() это альтернатива методу log() с переданным приоритетом Zend_Log::Err. Аналогичное поведение возможно для всех типов зарегистрированных приоритетов. Например warn(), notice().

Для получения полной информации посетите официальную документацию.

Профайлинг запросов к базе данных

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

Поместите следующий код в вашем загрузочном файле, после инициализации адаптера базы данных и перед запуском диспетчеризации:

$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
$profiler->setEnabled(true);
$db->setProfiler($profiler);

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

Попробуйте

Возможно, для отладки скриптов вы используете Zend_Debug::dump() или даже var_dump(). Попробуйте описанные выше компоненты, вы ничего не теряете. Они предлагают больше возможностей, нежели вывод отладочных данных в браузер. Особенно, это имеет значение, если ваше приложение имеет сложную архитектуру или же вы используете AJAX запросы, использующие в качестве ответа JSON или XML.

Даже если вы используете xDebug, FirePHP в некоторых случаях может сделать отладку более быстрой, ведь FirePHP не требует запуска отладочной сессии.

Если вызовы вроде Zend_Registry::get("logger")->debug(); кажутся вам слишком громоздкими, вы можете создать следующую функцию:

function fb($message, $label=null)
{
if ($label!=null) {
$message = array($label,$message);
}
Zend_Registry::get('logger')->debug($message);
}

Теперь ваши вызовы будут иметь следующий вид:

fb('Это тестовая отладочная информация!');
fb($_SERVER, 'Серверные переменные');

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

function fireExit() {

$frontController = Zend_Controller_Front::getInstance();

if($frontController->hasPlugin('Zend_Wildfire_Channel_HttpHeaders')) {
$wildfireHttpHeaders = $frontController->getPlugin('Zend_Wildfire_Channel_HttpHeaders');
$wildfireHttpHeaders->dispatchLoopShutdown();
}
$frontController->getResponse()->sendResponse();

exit;
}

В этом коде вызывается плагин и его событие dispatchLoopShutdown,отвечающее за отправление заголовков. Таким образом, вызывая функцию fireExit() вместо обычного exit, мы добиваемся того, что нужные данные попадат в консоль Firebug. (Thanks to Zh0rzh)

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

$writer->setEnabled(false);
$profiler->setEnabled(false);

Как все это выглядит вы можете видеть на картинке:

 

 

Лучший способ следить за обновлениями сайта это подписаться на RSS
Если информация была полезной для вас, вы можете поддержать сайт.
Комментарии:
andry 05.02.2009 15:41 #
Отлично, не знал, спасибо!
Ответить
Spirit 05.02.2009 16:22 #
Вещь действительно отличная!

токо один ньюанс. Насколько помню все это можно юзать лишь при стандартном ФронКонтроллере. Если нужно без него то код инициализации логера несколько иной - но он представлен в документации - так что копипаст спасет )
Ответить
Александр Махомет 05.02.2009 16:30 #
Да, об этом есть упоминание в статье.
Ответить
Spirit 06.02.2009 00:43 #
прошу прощение. для меня материал знаком - и немного черезчур быстро читал. Каюсь )
Ответить
Cartman 23.02.2009 21:59 #
Если использовать русские символы то у меня в в Firebug консоли ничего не выводится, а с английскими все ок
Ответить
uran1980 15.03.2009 14:46 #
Firebug работает с кодировкой UTF-8, поэтому если вы используете кодировку windows-1251, то в консоли будет пусто. У меня тоже такое было.
Ответить
Трофим 29.08.2009 11:38 #
Я для себя эту проблему решил изменив немного метод encodeObject() класса FirePHP. Просто добавил перекодировку элементов массива в зависимости от типа входящего объекта.
Ответить
kudesnik 15.03.2009 11:04 #
Если использовать русские символы то в Firebug консоли вместо русских символов выводятся ???, а с английскими все ок.
Ответить
uran1980 15.03.2009 14:47 #
Аналогично предыдущему комментарию.
Ответить
Dr0n 19.03.2009 19:30 #
Подскажите существует ли способ установить данные "расширения" для файерфокса локально? т.е. без наличия интернета. ну или может сборки есть с такими "расширениями"?
Ответить
lcf 19.03.2009 19:31 #
Да, расширение это просто файл. Его можно скачать, записать на дискетку а потом установить где нибудь там где нет интернета :)
Ответить
Dr0n 20.03.2009 08:45 #
да да спасибо, написал сообщение и сам вечером разобрался
в файерфоксе меню:
Файл\открыть файл
выбираем неообходимое расширение а дальше он сам запускает мастер установки
Ответить
tauruz 29.04.2009 22:44 #
А вот итересно содержание к статье у вас автоматически генериться или вы еге ручками делаете.
Ответить
lcf 29.04.2009 23:01 #
А как вы думаете?  :)
Ответить
tauruz 29.04.2009 23:03 #
Мне бы руками было бы делать лень, а как автоматом пока ума не приложу...
Ответить
lcf 29.04.2009 23:08 #
Вообще не вижу ничего сложного в генерации. Распарсить выбрать заголовки по тегам, сделать транслит для ссылок вот и содержание.

Но тут содержания делаются в ручную, это не сложно и не занимает времени посравнению с написанием статьи совершенно никакого.
Ответить
tauruz 29.04.2009 23:13 #
Да действительно ничего сложного))))
Спасибо!
Ответить
Уважаемые пользователи. Комментарии не для того чтобы:
  1. Спрашивать почему у вас не работает код, для этого есть тема форума закрепленная за статьей.
  2. Спрашивать как реализовать ту или иную функциональность, для этого необходимо создать свою тему на форуме.

Комментарии для того чтобы: высказать свое аргументированное мнение о статье, указать какие участки вызывают непонимание, что нужно исправить/улучшить, просто сказать спасибо.

Комментарии имеют древовидную структуру.
Если вы хотите ответить на определенный комментарий - нажмите на ссылку "Ответить" возле этого комментария.

Комментарии не соответствующие этим правилам могут быть удалены. Спасибо за понимание.
Комментарии временно отключены, вы можете воспользоваться форумом.