Дек 08 2008

Отладка проектов на CakePHP с использованием DebugKit

Раздел: ПлагиныМета @ 23:24

Сразу в двух публикациях нашел ссылки на замечательный плагин к CakePHP – DebugKit.

DebugKit предоставляет доступ к отладочной информации вашего приложения. С помощью него можно просматривать содержимое сессии, запроса, sql-лог, а также информацию о времени выполнения и производительности. И все это — в любом вашем проекте. Плагин совместим только с CakePHP 1.2 начиная с RC3.

Как использовать DebugKit?

Для начала, скачайте плагин и распакуйте содержимое архива в /app/plugins/debug_kit. Затем включите отладку в /app/config/core.php:

Configure::write('debug', 2);

И, наконец, добавьте в те контроллеры, где вам нужна отладка:

var $components = array('DebugKit.Toolbar');

Можно подключить компонент в /app/app_controller.php – тогда отладка будет доступна сразу во всех контроллерах.

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

Плагин DebugKit совместим с большинством классов view, если в них не реализуются функции _getViewFileName и _getLayoutFileName.

Поддержка Javascript

Для вывода панелей с информацией DebugKit может использовать несколько распространенных библиотек Javascript. Вот их полный список:

  • jQuery
  • Prototype
  • mootools
  • YUI
  • Library Agnostic (не полная поддержка)
  • Dojo (не полная поддержка)

По-умолчанию используется jQuery. Соответственно, нужная библиотека должна находиться в /app/webroot/js/.

Для выбора определенной библиотеки нужно модифицировать вызов плагина:

var $components = array('DebugKit.Toolbar' => array('javascript' => 'mootools'));

Для того чтобы полностью отключить поддержку javascript и перейти в режим css (IE6.0 в этом режиме не поддерживается!) надо вызывать плагин так:

var $components = array('DebugKit.Toolbar' => array('javascript' => false));

Настройка панелей

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

Встроенные панели включают:

  • Request – отображает информацию о текущем запросе к серверу, содержимое переменных GET, POST, параметры CakePHP, информацию о маршруте и его обработке, а также кукисы, если в вашем приложении подключен компонент CookieComponent из стандартного набора CakePHP.
  • Session – показывает всю информацию, сохраненную в сессии.
  • Timer – содержит названия и значения таймеров, установленных во время запроса (см. ниже).
  • Memory – здесь отображается расход памяти при выводе страницы и максимальный расход памяти.
  • Sql Logs – логи запросов для каждого настроенного подключения к базе данных.
  • Log – показывает записи, сделанные в log-файлы во время текущего запроса.
  • Variables – отображает переменные, переданные в шаблон из контроллера.

Вы можете настроить какие панели отображать. Например, если вам нужен только лог и сессия:

var $components = array('DebugKit.Toolbar' => array(
      'panels' => array('log', 'session')
      )
);

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

startup(&$controller)

Метод startup() вызывается у каждой панели во время выполнения startup() компонента DebugKit. $controller – это указатель на объект текущего контроллера.

beforeRender(&$controller)

Метод beforeRender() панели вызывается во время выполнения beforeRender() компонента. Точно также - $controller это указатель на текущий контроллер. В этом методе надо получать какие-либо данные из контроллера. Значение, возвращаемое этим методом автоматически передается в шаблон Toolbar компонентом. Обратите внимание — вы не должны из панели устанавливать переменные в контроллере, только считывать.

Новые классы панелей сохраняйте в папку vendors. Имя файла — название класса панели с маленькой буквы, слова разделены символом подчеркивания, в конце суффикс _panel. Например, файл панели MyCustomPanel должен называться my_custom_panel.php.

Пример метода beforeRender:

/*
 * beforeRender  - получаем параметры запроса
 *
 * @return array
 */
    function beforeRender(&$controller) {
        return $controller->params;
    }

Метод возвращает внутренний массив параметров контроллера. Содержимое массива параметров будет доступно в элементе шаблона как $content.

Каждая модель должна иметь элемент шаблона, который выводит содержимое панели. Имя файла элемента формируется также как имя файла панели, т.е. для панели SessionPanel элемент будет называться session_panel.ctp. Файлы элементов должны быть в папке views/elements.

Обязательно посмотрите как сделаны панели из стандартной поставки DebugKit, чтобы понять как они пишутся, и как делаются для них элементы.

Таймеры и измерение производительности

При использовании плагина DebugKit стандартный класс Debugger из комплекта CakePHP заменяется на DebugKitDebugger. В новом классе созданы специальные функции для измерения времени выполнения и производительности.

  • startTimer($name = ‘default’, $message = ”) - запускает таймер
  • stopTimer($name = ‘default’) — останавливает выбранный таймер
  • elapsedTime($name, $precision = 5) — возвращает пройденное время из выбранного таймера в виде целого числа с $precision знаков
  • GetTimers() - возвращает время со всех запущенных таймеров
  • clearTimers() - очищает таймеры
  • requestTime() - возвращает продолжительность запроса в момент вызова этого метода
  • getMemoryUse() - возвращает количество используемой памяти в момент вызова метода. Если недоступна функция memory_get_usage() - возвращает 0.
  • getPeakMemoryUse() - возвращает пиковое количество используемой памяти в байтах. Также, если недоступна функция memory_get_usage() - возвращает 0.

Теги: , , ,

2 Responses to “Отладка проектов на CakePHP с использованием DebugKit”

  1. илья says:

    Класс.
    Спасибо за плагин. просто замечательный!

    Кстати, у Вас нету никаких мыслей или статей (или примеров из личного опыта) по повышению производительности пирожка1.2?
    Дело в том что запрос к базе выполняется за 87ms , а Request time - 5-7 секунд…
    Я просто в шоке

  2. Мета says:

    Проверяйте хостинг, настройки сервера. У меня даже в больших проектах разлет не превышает 0.2254s - 1.6787s, и то это на собственном сервере.

Напиши комментарий!