Модуль профайлинга «ProfilerToolbar»

    Если вы используете Kohana, то скорее всего уже видели модуль DebugToolbar. Испробовав его на нескольких проектах, стало понятно, что его возможностей явно не хватает. А при использовании Ajax запросов данный модуль становиться вообще бесполезным.

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

    ProfilerToolbar


    В данном модуле очень хотелось видеть не просто SQL запросы, а еще их EXPLAIN информацию.

    ProfilerToolbar Tab: SQL Queries

    Так же хотелось следить за работой с кешем.

    ProfilerToolbar Tab: Cache

    Видеть данные о текущем роуте и его параметрах.

    ProfilerToolbar Tab: Route

    Часто приходится просматривать сложные структуры данных используя var_dump(); и не портить код самой страницы.

    ProfilerToolbar Tab: Your

    Плюс к вышеперечисленному, выводятся глобальные переменные ($_GET,$_POST,$_SESSION и т.д.) и список поключаемых в проекте файлов, но там ничего интересного нет и дабы не засорять статью лишними скриншотами просто оставлю ссылку на страницу данного модуля.


    Всё конечно хорошо, но как быть с Ajax запросами?

    Для этого имеется вывод всё тех же данных в FireBug и выглядит это следующим образом.


    Посмотреть развёрнутые группы


    Установка модуля


    Как и всегда, в файле bootstrap.php надо просто добавить строчку в список модулей с указанием каталога где он расположен. Но есть один ньюанс. Что бы получить дополнительную информацию о работе с кешем и о запросах к БД, мне пришлось переопределить их классы.
    Поэтому, что бы использовались классы модуля, он должен располагаться перед строками Cache и Database.

    Kohana::modules(array(
        ...
        'profilertoolbar' => MODPATH.'profilertoolbar',
        'cache'           => MODPATH.'cache',
        'database'        => MODPATH.'database',
        ...
      ));
    


    Как пользоваться


    Вывод панели на страницу

    Что бы вывести панель, надо в шаблоне нужной вам страницы написать: ProfilerToolbar::render(true);
    Я это делаю в основном шаблоне который выводится везде.

    <html>
    <body>
      ...
      content
      ...
      <?php ProfilerToolbar::render(true); ?>
    </body>
    </html>
    

    Вывод данных в FireBug

    После подключения модуля, данные в FireBug будут выводиться автоматически во всех методах любых контроллеров. Если вас это не устраевает и требуется просматривать данные только в определённых местах, то делаем следующим образом:
    1. Отключам в конфиге параметр showEverywhere

      ...
      // firebug data settings
      'firebug'=>array(
        'enabled'         => true, // if set FALSE, panel don't ...
        'showEverywhere'  => FALSE, // if set TRUE you don't need ...
      ...
    


    2. В нужном методе пишем ProfilerToolbar::firebug();
    Или в контроллере который отвечает за Ajax:

      class Controller_Ajax extends Controller {
         public function after(){
          ...
          ProfilerToolbar::firebug();
          parent::after();
        }
        ...
      }
    


    Добавление своих данных

    Если вам нужно просмотреть дамп какой-то переменной, то выводить её следует так:
      ProfilerToolbar::addData('first tab','test string');
      ProfilerToolbar::addData('first tab',rand(1, 1000)/ rand(1, 1000));
      ProfilerToolbar::addData('first tab',$user);
      ProfilerToolbar::addData('first tab',$this->request->headers());
      ProfilerToolbar::addData('second tab','other data');
    

    Получим результат как на данном скриншоте.

    Конфиг


    Что бы не приводить сюда листинг, можете посмотреть тут.
    В нём можно отключить как вывод самой панели так и вывод данных в FireBug, ну и всех параметров в отдельности.
    Например, изредка требуется посмотреть какие файлы подключаются в процессе выполнения скрипта, но как правило это не нужно и можно отключить параметр showIncFiles что значительно сократит генерируемый html код.

    Не забудьте в конфиге database включить profiling, в противном случае запросы отображаться не будут.

    Развитие


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

    Заключение


    Страница модуля и демо: alertdevelop.ru/projects/profilertoolbar
    Проект на гитхабе: github.com/Alert/profilertoolbar

    p.s. На демо странице отображается только панель со статической информацией без инфы в FireBug.

    Жду жёсткой критики :)
    Поделиться публикацией

    Похожие публикации

    Комментарии 46

      +2
      отличная вещь
      у вас есть в дальнейшем в планах сделать и для фреймворка Yii?
        0
        Не он так другой, в yii поболее информации можно вывести через LogRoute :) И цепляться автоматически будет в лайоут.
          0
          Всё хочу попробовать Yii, но никак не попадается такой проект на котором можно его потестить.
          Как только подвернёться, попробую портировать.
          +1
          Код еще не смотрел, но то, что Вы не следуете Kohana Conventions and Coding Style — это плохо. Вижу, Вы и сами в курсе, но быть может пара-тройка таких комментариев подтолкнет Вас к тому, чтобы придерживаться соглашений впоследствии ;)
          А так модуль полезный, только добавьте еще в статью информацию о совместимости с версиями фреймворка, если есть ограничения (хотя если нет — тоже скажите об этом)
            0
            Понимаю что соответствовать стилю надо, но если данный модуль особо никому не понадобится, то и тратить время на это не хочется.
            Ежели им будут пользоваться, то и код приведу к требуемому стилю и userguide организую)
              0
              На счет поддерживаемой версии фреймворка.
              На панели слева (первый скриншот), как раз и указана версия самого модуля + версия Kohana для которой он написан.
                0
                Модуль нужен :) И, когда будете форматировать код, замените пробелы на табы.
                +2
                Возможно я чего-то не понимаю, но у них очень странные стандарты. Всю жизнь писал if (TRUE == $var), просто чтобы сразу получить ошибку, если вдруг забуду второй знак равенства, и тут какой-то фреймворк заставляет меня писать if ($var == TRUE), аргументируя это тем, что мы читаем слева направо. Писать AND вместо && тоже как-то «необычно».

                А автору огромное спасибо за модуль.
                  0
                  Просто так естественнее, мы говорим «если это — правда», а не «если правда — это». Кстати, я к AND вместо && тоже долго не мог привыкнуть, но в итоге код читать легче. Там ведь вся соль этого стиля, чтобы читалось буквально «как говорится», просто и естественно.
                0
                Небольшой баг-репорт. Если модуль рендерится (<?php ProfilerToolbar::render(true); ?>) после инклуда скриптов гуглмапы (echo html::script('http://maps.google.com/maps/api/js?v=3.5&sensor=true');) — мапа не отображается (без каких-либо ошибок). Если перед — все отлично.

                А так — симпатично. Спасибо. :)
                  0
                  Спасибо, учту в следующей версии.
                  –6
                  Фреймворк очень интересный — но хабараэфект не держит =)
                    0
                    А почему бы не сделать решение автономным? Т.е. не зависящим от фреймворка? Чтобы каждый мог взять и «допилить» под любимый фреймворк/сайт, сам недавно думал написать подобное.
                      +1
                        +2
                        Спасибо конечно, но это не совсем то, что я ожидал. Во первых Copy the css/js/images folders of /your_pear_root/data/PHP_Debug in your project directory — это мне не нравится. Думаю что подобного рода плагины должны быть единоличны, сразу с css/js и как можно меньше внешних файлов. Можно обойтись и вообще без картинок. Ну и эта PEAR-установка, тоже можно обойтись без нее, имхо много лишнего, всё таки наверное напишу свой велосипед.
                          0
                          если что могу быть тестером :)
                        0
                        Идея хорошая, но по-моему утопичная. Я лично не вижу как такое можно реализовать.
                        Если только сделать шаблон html+css+js, а все данные каждый будет собирать сам, но это можно и из ProfilerToolbar шаблон выдернуть.
                      0
                      Для Zend Framework помнится был аналогичный тулбар: habrahabr.ru/blogs/zend_framework/62023/
                      Правда по моему начиная с какой-то версии его развитие приостановилось
                        0
                        Выглядит удобно. Я как раз и попробую на днях, как раз с коханой вожусь.
                        Единственное, не очень понял с драйвером БД — только мускуль? ПДО отвалится?
                          0
                          А, хотел же еще предложение предложить — добавить в конфиг флаг на окружение. Типа ставишь true, если вывод нужен только при Kohana::DEVELOPMENT === Kohana::$environment — чтобы во вьюхах и т.д. с условиями не заморачиваться.
                            0
                            Думаю добавлять это в репозиторий смысла нет. Я, например, панель и в продакшене какое-то время держу включенной, только она рендерится если юзер авторизован под admin'ом.
                            А если вам так удобней, то копируйте конфиг в /applications/config/profilertoolbar.php и извращайтесь как угодно =)
                              0
                              А там одним конфигом не отделаешься — флаг в render обрабатывать надо.
                              Тут вообще можно проще поступить:
                               ProfilerToolbar::render(Kohana::DEVELOPMENT === Kohana::$environment); 
                              

                              :)
                                0
                                Да, тоже вариант, но вообще по хорошему в продакшене этот модуль надо вообще отключать.
                                Но если его отключить, то ваш код вызовет ошибку и по-этому правильней будет:
                                <?php if(Kohana::$environment === Kohana::DEVELOPMENT) ProfilerToolbar::render(true);?>

                                А если лениво постоянно удалять его из bootstrap.php то можно сделать так:
                                $modules = array();
                                if(Kohana::$environment === Kohana::DEVELOPMENT){
                                  $modules['profilertoolbar'] = MODPATH.'profilertoolbar';
                                }
                                $modules['cache']       = MODPATH.'cache';
                                $modules['database'] = MODPATH.'database';
                                ...
                                Kohana::modules($modules);
                                
                                  0
                                  Если убирать из бутстрапа, то и во вьюхах/контроллерах такое-же условие нужно. Наверное лучше просто в render() проверку аргумента сделать сверху, а не перед выводом. Тогда только Kohana::find_file() поработает, а методы модуля не дернутся — все экономичней будет, бутстрап можно будет и не трогать.
                                    0
                                    Ну это масло маслянное получится. Там уже есть проверка.
                                    if(!self::cfg('html.enabled')) return '';


                                    Для вашей задачи надо всего лишь в конфиге написать:
                                      'html'=>array(
                                        'enabled' => Kohana::$environment === Kohana::DEVELOPMENT, 
                                        ...
                                      ),
                                      'firebug'=>array(
                                        'enabled' => Kohana::$environment === Kohana::DEVELOPMENT,
                                        ...
                                    
                                      0
                                      А, ну да, так лучше всего будет.
                            0
                            Я PDO не использую и забыл про него =)
                            Добавлю в следующей версии.
                            0
                            Спасибо, как будет время, портирую на yii. Вы не против?
                              0
                              Я только за! Сообщите как сделаете, размещу информацию на странице модуля
                                0
                                Ок, это только как будет время, но, уже есть пару идей по улучшению… В частности, не трогать главный шаблон и так далее…
                              +2
                              А почему Вы не хотите помогать развивать существующий, а решили сделать свой собственный?
                                0
                                Потому что мне в существующем не нравится всё, от дизайна до функционала.
                                Не могу же я отправить Pull Request на замену 100% кода =)
                                  0
                                  Видел на официальном форуме, не знал, что это наши люди сделали )) ИМХО, это немного другой подход к DebugToolbar, В первую очередь из-за внесения изменений в Cache и Database. Правильно сделали, что оформили как самостоятельный проект.
                                0
                                Спасибо! Как раз делаю в свободное от работы время на кохане небольшой проектик.
                                DebugToolbar также не устроил, а велосипеды писать не нашлось времени.
                                  0
                                  Если не трудно, опишите недостатки KDT. Может, удастся его немного улучшить в свободное время ;)
                                    0
                                    Как уже отметил автор, отладка Ajax-запросов и поддержка Firebug.
                                    Плюс, прозрачно описана отладка собственных переменных.
                                  0
                                  + Удобно
                                  + Функционально
                                  + Полезно
                                  — Не поддерживаются стандартные Code Conventions (простите, но правила — есть правила)
                                  — Частично дублируется функционал стандартного профайлера

                                  Ну просто (и я не знаю, откуда это взялось… и я не знаю, что с этим делать) многие стараются использовать все стандартное по максимуму. А поскольку разработчиками с большой буквы «Р» являются люди, доводящие все до конца, то ваши наработки пригодились бы и им тоже. Но увы…

                                  Но, как бы там ни было, это достойно внимания… Это стильно, модно, молодежно. Спасибо!
                                    0
                                    Частично дублируется функционал стандартного профайлера

                                    Это плохо? В стандартном профайлере информация выводится в неудобочитаемом виде. Я же сделал её приятной для восприятия и не портящей дизайн сайта + дополнительные плюшки.
                                      0
                                      Не портить дизайн сайта можно и стандартным профайлером. Вываливаете статистику в скрытый див, содержимое которого можно «всплывать» в боксе по нажатии на соответствующую ссылку. Ничего в этом сверхъестественного я не вижу.
                                    0
                                    Спасибо большое! Уже начали использовать в своем проекте
                                      0
                                      Модуль хороший, молодец! Но как обычно есть дёготь, так пришлось что надо было заюзать транзакции. Но увы сами запросы транзакции не показываются, раз ты уже переопределил класс БД, так может подправишь этот недочет?

                                        0
                                        Хорошо, потестирую в ближайшее время.
                                        Каким драйвером пользуетесь: mysql, pdo, ...?

                                        p.s.
                                        Если есть какие-то предложения по улучшению или нашли баги, то пишите лучше в Issue на github.com. Там удобней подобные вопросы решать.
                                        Либо на форум kohana в тему ProfilerToolbar for kohana 3.2
                                          0
                                          окей, опишу проблему на гитхабе.
                                        0
                                        Уже вышла Кохана 3.3, будите допиливать свою тулзу под эту версию? Я сам поставил, все завелось, но есть один минус, когда возникает ошибка, чтобы её увидеть приходиться отключать ваш модуль.
                                          0
                                          Да, буду. Сейчас времени не очень много, но в течении месяца точно сделаю.

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

                                        Самое читаемое