Регистрация отладочной информации

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

Решение
Параметр конфигурации auto_prepend_file позволяет поместить на страницу функцию, которая в зависимости от установленных констант будет печатать сообщения. Сохраните следующий код в файле debug.php:

// включаем отладку
define('DEBUG',true);
// конструируем отладочную функцию
function pc_debug($message) {
if (defined(DEBUG) && DEBUG) {
error_log($message);
}
}

Установите параметр auto_prepend_file в файле php.ini:

auto_prepend_file=debug.php

Теперь вызовите функцию pc_debug() из своей программы, чтобы вывести отладочную информацию:

$sql = 'SELECT color, shape, smell FROM vegetables';
pc_debug("[sql: $sql]"); // only printed if DEBUG is true
$r = mysql_query($sql);

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


Многие из них включают написание вспомогательного кода, позволяющего убедиться в корректности программы. Чем сложнее программа, тем больше требуется вспомогательного кода. В своей книге «The Mythical Man-Month: Essays on Software Engineering» Фредерик Брукс1 высказывает предположение, что «вспомогательный код по объему в два раза превосходит код собственно программы». Правильное перспективное планирование позволяет встро-ить вспомогательный код в логику программы ясным и эффективным образом. Но для этого требуется заблаговременно обдумать, что именно вы собираетесь измерять и записывать и как вы собираетесь анализировать данные, собранные этим вспомогательным кодом.

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

define('DEBUG',2);
function pc_debug($message, $level = 0) {
if (defined(DEBUG) && ($level > DEBUG) {
error_log($message);
}
}
$sql = 'SELECT color, shape, smell FROM vegetables';
pc_debug("[sql: $sql]", 1); // not printed, since 1 < 2
pc_debug("[sql: $sql]", 3); // printed, since 3 > 2

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

function getmicrotime(){
$mtime = microtime();
$mtime = explode(' ',$mtime);
return ($mtime[1] + $mtime[0]);
}
function db_query($sql) {
if (defined(DEBUG) && DEBUG) {
// начинаем отсчет времени выполнения запроса,
// если параметр DEBUG установлен в on
$DEBUG_STRING = "[sql: $sql]
\n";
$starttime = getmicrotime();
}
$r = mysql_query($sql);
if (! $r) {
$error = mysql_error();
error_log('[DB: query @'.$_SERVER['REQUEST_URI']."][$sql]: $error");
} elseif (defined(DEBUG) && DEBUG) {
// запрос успешный и параметр DEBUG включен,
// поэтому заканчиваем отсчет времени
$endtime = getmicrotime();
$elapsedtime = $endtime - $starttime;
$DEBUG_STRING .= "[time: $elapsedtime]
\n";
error_log($DEBUG_STRING);
}
return $r;
}

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


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

Функция getmicrotime() конвертирует вывод функции microtime() в формат, позволяющий без труда выполнять сложение и вычитание чисел.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Аутентификация, основанная на cookies
Буферизация вывода в броузер
Взаимодействие в рамках Apache
Идентификация различных броузеров
Настройка обработки ошибок

Вернуться в раздел: PHP / 8. Основы Web