Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

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

Решение

Параметр конфигурации 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);

Обсуждение

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

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

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]<br>\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]<br>\n";
          error_log($DEBUG_STRING);
     }

     return $r;
}

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

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

См. также

Документацию по функции define() на http://www.php.net/define, по функции defined() наhttp://www.php.net/defined и по функции error_log() на http://www.php.net/error-log;

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ