Yii PHP framework: создаём игровой сайт. Часть 9. Поиск ошибок.

Владимир | | MySQL, PHP, Web разработка, Yii.

yii game site bugs

В этой части цикла мы рассмотрим некоторые возможности, которые предоставляет нам Yii фреймворк для отладки приложения.

Сразу хочу предупредить, эта статья не претендует на полноту. Я расскажу только от тех инструментах, которые использовал при разработке игрового сайта. Более подробную информацию можно найти в разделе Журналирование и Обработка ошибок.

Включаем режим отладки

Для этого во входном скрипте (файл index.php, который находится в корневой папки сайта) константе YII_DEBUG должно быть присвоено значение true.

defined('YII_DEBUG') or define('YII_DEBUG',true);

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

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

Включаем журналирование ошибок

Тут все настройки выполняются в конфигурационном файле (protected/config/main.php). Фреймворк предлагает нам несколько вариантов ведения лога. Это запись в файл, вывод на экран, запись в базу данных, отправка по eMail.

За ведения лога отвечает компонент приложения CLogRouter. Подключаем и настраиваем его.

'components'=>array(
…
	'log'=>array(
		'class'=>'CLogRouter',
		'routes'=>array(
			array(
				//выводим лог внизу страницы
				'class'=>'CWebLogRoute',
				'levels'=>'trace, info, profile',
			),
		),
	),
…
),

В массиве components мы создали элемент под названием log и присвоили ему массив с настройками. В элементе class указываем название класса, который отвечает за работу компонента. В данном случае это CLogRouter.

Затем настраиваем маршрутизацию (routes). Именно здесь мы определяем куда какие сообщения будут выведены.

В данном случае использован класс CWebLogRoute это означает, что лог будет добавлен внизу страницы сайта.

Параметр levels определяет, что будут выведены сообщения имеющие уровень trace, info или profile. Всего существует пять уровней сообщений: trace, info, profile, warning, error. И с их помощью вы можете отфильтровать ненужную в данный момент информацию.

При переносе на рабочий сервер эти настройки очень желательно изменить. Например, можно использовать классы CFileLogRoute и CEmailLogRoute для записи сообщений в файл и одновременной отправки по eMail. Но во время отладки, лично мне удобнее просто прокрутить страницу и посмотреть сообщения, чем лезть в файл.

Для отправки своих сообщений можно использовать методы

Yii::log($message, $level, $category);
Yii::trace($message, $category);

Учтите, что метод trace работает только в режиме отладки. В параметре $message нужно указать текст сообщения, $level – уровень, $category – категория к которой относится сообщение (по-умолчанию равна application, но вы можете указать строку в формате xxx.yyy.zzz, например, system.web.CController, в результате сообщение будет добавляться в лог CController).

В нашем примере внизу страницы появится таблица с системными сообщениями. Вы сможете посмотреть какие компоненты и в каком порядке создавались при формировании страницы.

Отладка запросов к БД

В состав Yii фреймворка входит хорошая библиотека для работы с базой данных. Тем не менее, полезно знать какие именно SQL запросы она формирует. Особенно, если у вас нет предварительного опыта работы с ней.

Для того, чтобы включить вывод запросов в лог, необходимо указать параметр 'enableParamLogging'=>true в настройках базы.

'db'=>array(
…
	'enableParamLogging'=>true,
	'enableProfiling'=>true,
…
),

Кроме того, полезно тут же включить профайлинг работы с базой. Это позволит узнать сколько запросов было выполнено при формировании страницы и время их выполнения.

Для того, чтобы вывести результаты профайлинга открываем макет страницы (protected/views/layouts/main.php) и добавляем в хвостовик пару строчек

$dbStats = Yii::app()->db->getStats();
echo 'Выполнено запросов: '.$dbStats[0].' (за '.round($dbStats[1], 5).' сек)';

Как видите, мы получили массив в первом элементе которого хранится общее количество запросов, а во втором – время их выполнения.

Выводим информацию об использовании ресурсов

Эти данные мы тоже выведем в хвостовике страницы

$memory = round(Yii::getLogger()->memoryUsage/1024/1024, 3);
$time = round(Yii::getLogger()->executionTime, 3);
echo '<br />Использовано памяти: '.$memory.' МБ<br />';
echo 'Время выполнения: '.$time.' с<br />';

Для получения этой информации мы использовали класс CLogger. Он содержит два нужных нам метода: memoryUsage (возвращает объём использованной памяти, в байтах) и executionTime – время создания страницы.

Как видите, ничего сложного. Если возникли вопросы или есть замечания, пишите, постараюсь ответить 😉

Все разделы цикла.

  1. Yii PHP framework: создаём игровой сайт. Часть 1. Постановка задачи.
  2. Yii PHP framework: создаём игровой сайт. Часть 2. База данных и установка фреймворка.
  3. Yii PHP framework: создаём игровой сайт. Часть 3. Аутентификация.
  4. Yii PHP framework: создаём игровой сайт. Часть 4. Работа с жанрами игр.
  5. Yii PHP framework: создаём игровой сайт. Часть 5. Импорт игр.
  6. Yii PHP framework: создаём игровой сайт. Часть 6. Формируем страницы игр и жанров.
  7. Yii PHP framework: создаём игровой сайт. Часть 7. Работа с JavaScript и страницы игр.
  8. Yii PHP framework: создаём игровой сайт. Часть 8. Создаём виджеты.
  9. Yii PHP framework: создаём игровой сайт. Часть 9. Поиск ошибок.
  10. Yii PHP framework: создаём игровой сайт. Часть 10. Панель управления.
  11. Yii PHP framework: создаём игровой сайт. Часть 11. Человекопонятные URL.
  12. Архив с исходниками

Интересно почитать

Выбираем систему охлаждения для ПК.

  • Можно так же поставить дебаг-панель (типа как у Симфони) http://code.google.com/p/yiidebugtb/ — очень полезная штука…

    • Спасибо за ссылку! Нужно будет попробовать.

    • Спасибо 🙂 довольно удобно

  • Можно так же поставить дебаг-панель (типа как у Симфони) http://code.google.com/p/yiidebugtb/ — очень полезная штука…

    • Спасибо за ссылку! Нужно будет попробовать.

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

    • Я хочу уточнить. Речь об этом примере или о каком-то вашем сайте?

      • О своем сайте. Наверное, это я ошибок слишком много понаделал. Еще учусь.

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

    • Я хочу уточнить. Речь об этом примере или о каком-то вашем сайте?

      • О своем сайте. Наверное, это я ошибок слишком много понаделал. Еще учусь.

  • Спасибо большое! Все очень понятно написано, я так и сделала. Все получилось.

  • Спасибо большое! Все очень понятно написано, я так и сделала. Все получилось.