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

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

    Сегодня я хотел бы рассказать об одном замечательном расширении 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();
    	}
    }
    

    Результат:


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

    С уважением, Роман.
    Share post

    Similar posts

    Comments 47

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

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

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

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

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

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

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

                                                  Единственное замечание если в настройках прописана строка константа с IP, то отключение YiiDebugToolbar можно делать только через 'enabled'=>YII_DEBUG, в случае же с gethostbyname лучше строку все же комментировать так же.
                                                    0
                                                    Меня вот что-то смущает один момент: а на продакшене 'enabled'=>YII_DEBUG же будет в false установлено и логирования вообще всего не будет. Это же ни есть хорошо?
                                                      0
                                                      На продакшене лучше использовать только нативное логирование пхп и только критических ошибок, дабы не нагружать основной процесс. Логирование на уровне фремворка включается только на dev и demo площадках.
                                                        0
                                                        Аха, а я почему-то думал, что логирование на уровне фреймворка будет полезно и для продакшена. Спасибо за разъяснение.

                                                    Only users with full accounts can post comments. Log in, please.