29 августа 2011 в 10:50

Расширение yii-debug-toolbar

Yii*
Доброе время суток хабравчане.

Сегодня я хотел бы рассказать об одном замечательном расширении yii-debug-toolbar от Сергея Малышева.

Вкратце


Это расширение добавляет очень симпатичную и удобную дебаг панель.

yii-debug-toolbar имеет 5 вкладок:
  • Server: отображает информацию из phpinfo();
  • Time: отображает время загрузки страницы, размер затраченной памяти и размер сессии;
  • Globals: отображает дампы глобальных переменных ($_SERVER, $_COOKIE, $_SESSION, $_POST, $_GET, $_FILES);
  • Settings: отображает конфиг приложения (все параметры, компоненты и глобальные настройки);
  • SQL: отображает информацию о SQL сервере и лог по SQL запросам (сам запрос и время исполнения);
  • Logging: отображает лог информацию (отправленную через Yii::log).




Установка


Итак, что бы установить такую панель на свой тестовый сервер Вам понадобиться скачать исходник последней верссии отсюда www.yiiframework.com/extension/yii-debug-toolbar. Распаковываем архив в папку /protected/extensions. Затем в конфиге прописываем в компонент log
#...
'log'=>array(
	'class'=>'CLogRouter',
	'enabled'=>YII_DEBUG,
	'routes'=>array(
		#...
		array(
			'class'=>'CFileLogRoute',
			'levels'=>'error, warning',
		),
		array(
			'class'=>'application.extensions.yii-debug-toolbar.YiiDebugToolbarRoute',
			'ipFilters'=>array('127.0.0.1','192.168.1.215'),
		),
	),
),
#...

После чего, справа вверху должен появиться синий жук (аля фаербаг). Если он у Вас есть, значит Вы все сделали правильно.

Настройка


Все параметры компонент наследует от CLogRouter. Но есть у него и один свой параметр: ipFilters. Это массив разрешённых IP адресов. Если Вы не хотите случайно выложить копию с дебаг баром на продакшн, то впишите туда свой IP адрес, и панель будет доступна только с Вашего компьютера.
Параметры наследуемые от CLogRouter:
  • bool enabled: если false — то дебаг отключен (я обычно ставлю туда константу YII_DEBUG, тогда можно быстро и глобально отключить дебаг);
  • string levels: список уровней логирования через запятую или пробел;
  • string categories: список категорий логирования через запятую или пробел;
  • array filter: дополнительные фильтры (например CLogFilter);
  • array logs: логи, собранные по ходу выполнения программы.

На сладкое. Как создать свою панель в yii-debug-toolbar?


Автор расширения позаботился о разработчиках, использующих его продукт и сделал возможность безболезненно добавлять свои табы. Давайте попробуем создать панель с названием «Test». Для этого в папку /protected/extensions/yii-debug-toolbar/panels нужно добавить новый файл YiiDebugToolbarPanelTest.php и создать в нем новый класс YiiDebugToolbarPanelTest, который наследуется от YiiDebugToolbarPanel. Этот класс должен реализовывать 5 методов:
  • getMenuTitle: метод возвращает название таба в боковой панели;
  • getMenuSubTitle: метод возвращает описание таба в боковой панели;
  • getTitle: метод возвращает название таба непосредственно внутри таба (наверху, на желтой полосе);
  • getSubTitle: метод возвращает описание таба непосредственно внутри таба (наверху, на желтой полосе);
  • run: отображает контент таба.

И добавить таб в свойство $_panels класса YiiDebugToolbar (/protected/extensions/yii-debug-toolbar/YiiDebugToolbar.php)
class YiiDebugToolbarPanelTest extends YiiDebugToolbarPanel{
    function getMenuTitle(){ return 'Test'; }
    function getMenuSubTitle(){ return 'subtest'; }
    function getTitle(){ return 'TEST v1.0'; }
    function getSubTitle(){ return 'Hello Vasya'; }
	function run(){
		echo '<h4>'.self::getSubTitle().'</h4>';
		echo rand();
	}
}

Результат:


Если кому-то интересно, в следующей статье могу рассказать как написать свой логгер.

С уважением, Роман.
+35
94
rmrevin 5,5 G+

комментарии (44)

–1
dirmax, #
Красивая? Вы лучше посмотрите красота какая для ZendFramework — code.google.com/p/zfdebug/
+1
rmrevin, #
как раз сегодня наткнулся на подобную реализацию
www.yiiframework.com/extension/yiidebugtb
но yii-debug-toolbar мне нравится больше
0
slik, #
Он уже давно ушёл с гуглкода на гитхаб и стал совсем другим, красивым и модным :)
0
rmrevin, #
Мне как-то старый дизайн больше по нраву. Ностальгия по серым виндовым окошкам.
0
dohlik, #
Ага, в Kohana такую же сделали — удобная весчь.
0
zaabjuda, #
Мне одному это напоминает django-debug-toolbar ???
0
MrLoki, #
Врядли одному.
А какая собственно разница? Главное, чтобы работало, не так ли?
+1
zaabjuda, #
Абсолютно так.
0
dals, #
Symfony в свое время очень радовал такой панелькой. Джанго, собственно, тоже. Почему бы и нет? :)
+1
skinner, #
Он не просто напоминает. django-debug-toolbar'a мне в Yii очень не хватало, вот я его частично и перенес.
0
Dennion, #
Панелька красивая, я для своего велосипеда сделал подобную.
image
0
Claud, #
А еще рекомендую xdebug у него вывод тоже очень информативен и есть куча всяких дополнительных возможностей.
0
bitfroster, #
Тут решение более заточенное под конкретный framework.
+1
rmrevin, #
Не нашел расширения для Yii. На досуге попробую прикрутить. Спасибо за наводку.
+1
nayjest, #
Не нужны никакие расширения Yii, это расширение PHP, которое для своей работы ничего не требует от php-кода и является полноценным дебаггером (интерфейс для отладки через xdebug есть во многих IDE'шках).
0
rmrevin, #
Я понимаю, что это самостоятельный продукт. Но нужно его же интегрировать в ядро. А для этого нужно расширять CLogRouter с функциями xdebug
0
nayjest, #
Не нужно, xdebug не выполняет функции логирования, соответственно CLogRouter здесь вообще не при делах, разве что можно вывести служебную информацию типа отправленных хедеров, списка ошибок, использования памяти(а это уже вторичный функционал).

С помощью xdebug вы можете к примеру задавать через ide'шку точки останова, где выполнение php кода будет останавливаться и через ту же ide смотреть значения нужных вам переменных, выполнять код пошагово, причем можно даже на удаленном сервере.

Это основное назначение. И я здесь не вижу необходимости и способов интеграции с фреймворком, кроме как вывести разного рода мелочи типа использования памяти.
0
rmrevin, #
Я Вас понял. Просто не работал с это библиотекой и не знаю её принципов. Посмотрю на досуге.
0
Claud, #
Если у вас есть время и желание, то думаю все-таки вам стоит посмотреть. Т.к. возможностей там много (смотрите ниже я писал и на хабре тоже есть несколько статей по теме).
0
Claud, #
Вы не правы. У xdebug очень богатый функционал. Который можно поделить на 3 части.
1. Удаленная отладка — это то про что вы говорите.
2. Весьма навороченный профайлер (собранный лог можно анализировать в специальных программах).
3. Более информативный вывод ошибок (то о чем в посте). Вывод можно настраивать (куча всяких настроек).

Но я наверняка уверен, что интегрировав в Yii можно будет добиться еще больших результатов.
0
nayjest, #
Это вы сами закастомайзили дизайн yii-debug-toolbar'а или он такой в новых версиях? Неплохо выглядит.
Мне вот не хватает возможности включать/выключать тулбар get-переменной, которая потом сохраняется в сессии, надо будет как-то набросать такой костылик.

Еще очень кстати была бы вкладочка с переменными, которые передаются во вьюшки, это правда придется в рендерер внедряться, но если это получится сделать к примеру миксином, который через конфиг можно будет присобачить к любому рендереру — было бы чудесно. (Может такое уже есть, тогда делитесь ссылкой)
0
nayjest, #
Извиняюсь, насчет дизайна панельки — все ясно, я перепутал с этой штукой, которую и использую в своих проектах.
Кстати, можно было бы сравнить эти две панельки, интересно, у какой из них больше преимуществ.
+1
rmrevin, #
Сегодня утром ставил yiidebugtb и моё личное мнение — сыровато.
yii-debug-toolbar более информативен и красив.
+1
nayjest, #
yiidebugtb на полтора года старше, так что я бы о нем не говорил «сыровато», но yii-debug-toolbar по крайней мере на скриншотах выглядит не менее интересно, это да.

А как вы решаете проблему с action'ами, которые отдают данные ajax'ом? (такие тулбары по идее должны все ломать)
0
skinner, #
Вот на выходных «допилил». Появилась еще одна панель которая выводит информацию о всех отрендеренныъ вьюшках, дамп переданных во вью данных и состояния контроллера(ов)/виджетов на момент рендеринга вьюшек. Теперь бы отзывы от общественности получить )
+1
nayjest, #
Раз дело зашло об инструментах для отладки под Yii, могу еще посоветовать www.yiiframework.com/extension/php-console/ для тех, кто использует Chrome (расширение для работы с phpConsole, аналог FirePhp, отправляет всю отладочную информацию в хедерах)
+1
rmrevin, #
CWebLogRoute имеет параметр showInFireBug. Допилить класс для большей информативности и можно в фаербаг всё кидать.
0
nayjest, #
Круто, спасибо! Не знал, что это в родном функционале, а я думаю: что за беда, почему же нигде не могу найти такое востребованное расширение, как logRoute под Firebug )
0
rmrevin, #
Так в принципе элементарная задача, ставим firephp и расширяем основной класс: перенаправляем вывод в консоль.
+3
skinner, #
Спасибо всем за отзывы, критику и предложения. Ввиду дефицита времени в данный момент, инструмент получился достаточно скудный по функционалу, но в ближайшее время я планирую возобновить работу и добавить массу полезных вещей. Если у вас есть какие то идеи по улучшению этого инструмента — размещайте на GitHub, по мере возможности буду реализовывать.
0
rmrevin, #
Спасибо Вам за такое расширение.
0
Nc_Soft, #
Почему-то sql запросы не отображаются. Я делаю через CActiveDataProvider
+1
rmrevin, #
В компонент db нужно добавить параметр enableProfiling = true
0
Nc_Soft, #
спасибо, разобрался
+1
skinner, #
Там в ссылке на расширение в каталоге расширений Yii закралась ошибка — лишняя точка в линке. Поэтому ссылка не работает. Подправьте пожалуйста.
+1
rmrevin, #
Спасибо, исправил.
0
red_pilot, #
Очень мешает тот факт, что расширение не работает, когда на странице есть JS ошибки.
yiidebugtb в таких случаях продолжает работать.
0
skinner, #
Спасибо, учту ваше замечание.
0
tnz, #
Если драйвер БД dblib, то упадет по эксепшену при попытке взять аттрибуты соединения, т.к. драйвер не поддерживает эту функцию. Это файл yii-debug-toolbar/panels/YiiDebugToolbarPanelSql.php строка 201. Предлагаю либо там добавить проверку на
'dblib' !== $connection->driverName
или обернуть все это дело в try{}catch
0
Dr_Death, #
А можно по аналогии с ipFilter добавить фильтр по юзерам?
0
Anton_Gorodezkiy, #
Отличная панелька! Спасибо за ваш труд)
0
sp3ctr00m, #
C yiilite не работает…
0
itspoma, #
бывает что расширение подглючивает, и он выводит только линк для показа debug-toolbar, но самого тулбара так и не выводит.
для этого небольшой фикс в YiiDebugToolbarRoute.php:

    public function collectLogs($logger, $processLogs=false)
    {
        $startEndTime = $this->_endTime;
 
        parent::collectLogs($logger, $processLogs);
 
        if ($this->_endTime == $startEndTime) {
            $this->processLogs(null);
        }
    }
 
    protected function processLogs($logs)
    {
        $this->_endTime = microtime(true);
 
        // disable log route based on white list
        $this->enabled = $this->enabled && $this->checkContentTypeWhitelist();
        $this->enabled && $this->getToolbarWidget()->run();
    }
0
salopot, #
Если отладка производится на компьютере с динамическим IP, то удобно в конфигурации прописать так:
'ipFilters'=>array(
                        gethostbyname('XXX.dyndns-ip.com'),
                    ),

Или выбрать любого другого провайдера предоставляющего услугу динамической привязки. Выбор последнего у меня обусловлен только тем что его поддерживаем мой модем.

Единственное замечание если в настройках прописана строка константа с IP, то отключение YiiDebugToolbar можно делать только через 'enabled'=>YII_DEBUG, в случае же с gethostbyname лучше строку все же комментировать так же.

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

Собеседование на junior позицию. Антипатерны собеседующих
Valve выпустила Half-Life под Linux
Curiosity вернулся