Zend Framework и FirePHP
Опубликовано: 05.02.2009
|
- Расширение FirePHP
- Установка Firebug и FirePHP
- Логирование в FirePHP с помощью Zend_Log
- Профайлинг запросов к базе данных
- Попробуйте
Эта статья является переводом заметки Сhristoph Dorn -
Начиная с версии 1.6 в Zend Framework появилась поддержка FirePHP! Это значит, что у поклонников браузера Firefox появилась возможность производить логирование в Firebug консоль, не скачивая никаких дополнительных PHP файлов, например библиотеку FirePHPCore.
На текущий момент Zend Framework поставляет две основных компоненты, это
Нам необходимо установить Firebug и FirePHP расширения для Firefox.
Логированние в 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);
Как все это выглядит вы можете видеть на картинке:

- Спрашивать почему у вас не работает код, для этого есть тема форума закрепленная за статьей.
- Спрашивать как реализовать ту или иную функциональность, для этого необходимо создать свою тему на форуме.
Комментарии для того чтобы: высказать свое аргументированное мнение о статье, указать какие участки вызывают непонимание, что нужно исправить/улучшить, просто сказать спасибо.
Комментарии имеют древовидную структуру.
Если вы хотите ответить на определенный комментарий - нажмите на ссылку "Ответить" возле этого комментария.