G
Gisma
В процессе разработки больших проектов крайне необходимы возможность профилирования системы, отслеживания внутренних процессов. Для этого и предназначен представленный класс.
В возможности класса входят работа с таймерами, установка чек-поинтов, пользовательских сообщений и категоризация ошибок. В качестве дополнительной возможности класс сохраняет предыдущие отладки в сессию и может выводить их при следующих загрузках, это полезно в случае редиректов. Также есть возможность сохранения отчета в отдельный файл. Он определяет кол-во использованной оперативной памяти, ОС, текущего пользователя, имя скрипта, записывают в дебуг содержимое сесси, кукисов, массивов _GET, _POST,_REQUEST, _FILES и т.д.
Необходимые директивы (define) для настройки - нету
Директивы используюемые в настройке :
DEBUG - установленная в 1 активизирует работу класса, если установлена 0 то класс ничего не выполняет. Устанавливайте в 0 если вы уверены что система работает корректно и нет необходимости в дальнейшей работе профилизатора
DEBUG_FILE - указывает на путь к файлу, куда будет записан дебуг активной страницы.
DEBUG_COUNT - Указывает количество страниц, которые сохранит класс в сессию. Оптимальные числа 3 или 4
Основный методы класса :
addDebug($cat,$msg) - добавляет сообщение $msg в категорию $cat
addProperty($msg) - добавляет сообщение в заголовок отладки. Туда обычно складывают самые важные данные (например количество использованной оперативной памяти)
addCheckpoint($name) - добавляет чекпоинт с именем $name. Чек-поинты полезно применять в случаях когда необходимо проверить, дошел ли интерепретатор до указанной точки и когда он это сделал. Т.е. они устанавливаются для проверки достижимости указанной точки + подсчета времени
addError($cat,$msg) - добавляет сообщение об ошибке (они выделяют красным цветом) $msg в категорию $cat
startTimer($name) - стартует таймер с именем $name, Соотв сообщение идет в отладку. Команды StartTimer и FinishTimer работают со стеком, поэтому они могут следовать одна за другой соблюдая вложенность :
finishTimer() - завершает таймер, соотв. сообщение идет в отладку. В сообщении отмечается сколько миллисекунд прошло с момента вызова startTimer
Код класса :
Примеры работы :
Базовый пример старта работы
Балуемся с командами startTimer и endTimer
Работаем с категориями и командами addDebug addError
Работаем с командами addAlert
В возможности класса входят работа с таймерами, установка чек-поинтов, пользовательских сообщений и категоризация ошибок. В качестве дополнительной возможности класс сохраняет предыдущие отладки в сессию и может выводить их при следующих загрузках, это полезно в случае редиректов. Также есть возможность сохранения отчета в отдельный файл. Он определяет кол-во использованной оперативной памяти, ОС, текущего пользователя, имя скрипта, записывают в дебуг содержимое сесси, кукисов, массивов _GET, _POST,_REQUEST, _FILES и т.д.
Необходимые директивы (define) для настройки - нету
Директивы используюемые в настройке :
DEBUG - установленная в 1 активизирует работу класса, если установлена 0 то класс ничего не выполняет. Устанавливайте в 0 если вы уверены что система работает корректно и нет необходимости в дальнейшей работе профилизатора
DEBUG_FILE - указывает на путь к файлу, куда будет записан дебуг активной страницы.
DEBUG_COUNT - Указывает количество страниц, которые сохранит класс в сессию. Оптимальные числа 3 или 4
Основный методы класса :
addDebug($cat,$msg) - добавляет сообщение $msg в категорию $cat
addProperty($msg) - добавляет сообщение в заголовок отладки. Туда обычно складывают самые важные данные (например количество использованной оперативной памяти)
addCheckpoint($name) - добавляет чекпоинт с именем $name. Чек-поинты полезно применять в случаях когда необходимо проверить, дошел ли интерепретатор до указанной точки и когда он это сделал. Т.е. они устанавливаются для проверки достижимости указанной точки + подсчета времени
addError($cat,$msg) - добавляет сообщение об ошибке (они выделяют красным цветом) $msg в категорию $cat
startTimer($name) - стартует таймер с именем $name, Соотв сообщение идет в отладку. Команды StartTimer и FinishTimer работают со стеком, поэтому они могут следовать одна за другой соблюдая вложенность :
Код:
startTimer()
startTimer()
startTimer();
finishTimer();
startTimer()
finishTimer();
finishTimer();
finishTimer();
finishTimer() - завершает таймер, соотв. сообщение идет в отладку. В сообщении отмечается сколько миллисекунд прошло с момента вызова startTimer
Код класса :
Код:
<?php
//************************************************************//
// //
// Сервис Trace //
// Copyright (c) 2006 ООО SmartDesign //
// отдел/сектор //
// Email: gisma@smartdesign.by //
// //
// Разработчик: Gisma (2005.11.01) //
// Модифицирован: 19.12.2006 by Gisma //
// //
//************************************************************//
if (!defined('BACKPAGE')) {
define('BACKPAGE',30);
}
if (!defined('DEBUG')) {
define('DEBUG',0);
}
if (!defined('DEBUG_COUNT')) {
define('DEBUG_COUNT',1);
}
class CTrace {
var $aTimer = array();
var $aColors;
var $aAlert = array();
var $aMessages = array();
var $aCategory = array();
var $aProperty = array();
var $aCheckpoint = array();
var $fExecStart;
var $fExecFinish;
// переменные-шаблоны вывода
// шаблоны полного списка сообщений
var $szTemplateMessage;
var $szTemplateMessageList;
// шаблоны свойств
var $szTemplateProperty;
var $szTemplatePropertyList;
// шаблоны предыдущих дебугов
var $szTemplateOldDebug;
var $szTemplateOldDebugList;
// шаблоны категорий
var $szTemplateCategory;
var $szTemplateCategoryList;
// шаблоны категорий
var $szTemplateCheckpoint;
var $szTemplateCheckpointList;
// Алерты
var $szTemplateAlert = '';
// Output
var $szTemplateOutput = '';
var $szTemplateCurrentDebug = '';
/**
* @desc
*/
function Destroy(){
if (!isset($_SESSION['_trace'])) $_SESSION['_trace'] = array();
$_SESSION['_trace']['alert'] = $this->aAlert;
}
/**
* @desc Конструктор, инициализирует цвета пунктов
*/
function CTrace() {
global $Application;
// проверяем константы необходимые для работы
if (!defined('DEBUG')) {
die('Debug - Constant not defined');
}
// алерты и хистори страниц
if (!isset($_SESSION['__trace'])) $_SESSION['__trace'] = array();
if (isset($_SESSION['_trace']['alert'])) $this->aAlert = $_SESSION['_trace']['alert'];
if (!isset($_SESSION['__backpage'])) $_SESSION['__backpage'] = array();
// удаляем страницы из хистори
if (defined('BACKPAGE'))
while (count($_SESSION['__backpage']) > BACKPAGE)
array_shift($_SESSION['__backpage']);
// если дебуг не активирован дальнейшая работа не активна
if (DEBUG == 0) {
return;
}
$this->clearOldDebugs();
// стартуем счетчик
$this->startProgram();
$this->defineTemplates();
$this->addRequest();
}
/**
* @desc Стартует внутренний таймер отсчета работы системы
* @return
*/
function startProgram() {
if (DEBUG == 0) return;
$aTmp = explode(' ',microtime());
$this->fExecStart = floatval($aTmp[0]) *1000 + 1000 * intval($aTmp[1]);
}
/**
* @desc завершает внутренний таймер отсчета работы системы
* @return
*/
function finishProgram() {
if (DEBUG == 0) return;
$aTmp = explode(' ',microtime());
$this->fExecFinish = floatval($aTmp[0]) *1000 + 1000 * intval($aTmp[1]);
$this->addProperty('Время исполнения программы :'.($this->fExecFinish - $this->fExecStart).' мс<Br>'."\r\n");
}
function defineTemplates() {
$this->aColors = array(
'8495BB','FFCC66','00FF66',
'9999FF','CC99FF','FF9999',
'FCFC00','CCCCCC','CCDD99',
'FFFF66','8495BB','FFCC66','00FF66',
'9999FF','CC99FF','FF9999',
'FCFC00','CCCCCC','CCDD99',
'FFFF66','8495BB','FFCC66','00FF66',
'9999FF','CC99FF','FF9999',
'FCFC00','CCCCCC','CCDD99',
'FFFF66','8495BB','FFCC66','00FF66',
'9999FF','CC99FF','FF9999',
'FCFC00','CCCCCC','CCDD99',
'FFFF66','8495BB','FFCC66','00FF66',
'9999FF','CC99FF','FF9999',
'FCFC00','CCCCCC','CCDD99','FFFF66'
);
$this->szTemplateProperty = '<tr><td><b>%s</b></td></tr>';
$this->szTemplatePropertyList= <<<EOD
<table border="0" cellpadding="0" cellspacing="1" width="100%%">
%s
</table>
EOD;
$this->szTemplateMessage = <<<EOD
<tr><td bgcolor="Ghostwhite"><b><center>%s</center></b></td><td bgcolor="#999999" width="80%%" valign="top"><center>%s</center></td><td bgcolor="#999999"><center>%s</center></td>
<td bgcolor="#999999"><center>%s</center></td></tr>
EOD;
$this->szTemplateMessageList = <<<EOD
<table width="100%%" border="1" align="center" cellpadding="0" cellspacing="0" bgcolor="Limegreen"><tr> <td colspan="4" align="center"> <h3>General info</h3></td></tr>
%s
</table>
EOD;
$this->szTemplateOldDebug = '%s';
$this->szTemplateOldDebugList = '%s';
$this->szTemplateCategory = <<<EOD
<tr>
<td valign="top" bgcolor="#999999"> %s </td>
<td width="20%%" valign="top" bgcolor="#999999">
<b>%s</b>
</td>
</tr>
EOD;
$this->szTemplateCategoryList = <<<EOD
<table border="0" cellpadding="3" cellspacing="1" width="100%%"><tr></tr><td colspan="1" align="center" ><div style="background-color:#%s"><strong>%s</strong></div></td>
<td> Time from start</td></tr>
%s
</table>
EOD;
// Чек-поинты
$this->szTemplateCheckpointList = <<<EOD
<h2> Check Points </h2>
<table border="0" cellpadding="3" cellspacing="1" bgcolor="lightblue" width="100%%">
<tr> <td width=80%%> Message </td> <td width=20%%> Time from begining </td> </tr>
%s
</table>
EOD;
$this->szTemplateCheckpoint = <<<EOD
<tr>
<td> %s </td>
<td> %s </td>
</tr>
EOD;
$this->szTemplateCurrentDebug = <<<EOD
<table border="0" cellpadding="3" cellspacing="1" width="100%">
%s
</table>
EOD;
$this->szTemplateAlert = <<<EOD
<script>alert('%s')</script>
EOD;
$this->szTemplateOutput = <<<EOD
<div id="__debug" style="visibility:hidden;position:absolute;left:0;top:0;background-color:#CCCCCC;z-index:999">
%s
</div>
<script>
prevKeyDown = document.onkeydown;
bFlag = 0;
document.onkeydown = function (e) {
if (e == null)
{
e = event
}
if (e.ctrlKey && (e.keyCode == 192 || e.keyCode == 96))
{
div = document.getElementById('__debug');
if (bFlag == 0)
{
div.style.visibility = '';
} else {
div.style.visibility = 'hidden';
}
bFlag = 1 - bFlag;
}
if (prevKeyDown)
{
prevKeyDown(e);
}
}
</script>
EOD;
}
/**
* @desc стартует таймер
* @return Возвращает текущее время
*/
function StartTimer($szName = 'timer') {
if (DEBUG == 0) return;
$aTmp = explode(' ',microtime());
$fTime = floatval($aTmp[0]) *1000 + 1000 * intval($aTmp[1]);
array_push($this->aTimer,$fTime);
$szAdd = str_repeat('>>',sizeof($this->aTimer));
$aDebugBacktrace = debug_backtrace();
$szDebugBacktrace = $szAdd.'File <span style="color:red;" >`'.$aDebugBacktrace[0]['file'].'`</span> on line <Strong>`'.$aDebugBacktrace[0]['line'].'`</strong> </span>';
$this->aCheckpoint[] = array(
'name' => $szAdd.'Start timer : <span color="blue"> `'.$szName.'`</span><br>'.$szDebugBacktrace,
'time' => ($fTime - $this->fExecStart)
);
}
/**
* @desc финиширует таймер
* @return Возвращает текущее время
*/
function FinishTimer(){
if (DEBUG == 0) return;
if (sizeof($this->aTimer) == 0) return;
$aTmp = explode(' ',microtime());
$fTime = floatval($aTmp[0]) *1000 + 1000 * intval($aTmp[1]);
$szAdd = str_repeat('<<',sizeof($this->aTimer));
$fStart = array_pop($this->aTimer);
$fResult = $fTime - $fStart;
$aDebugBacktrace = debug_backtrace();
$szDebugBacktrace = $szAdd.'File <span style="color:red;" >`'.$aDebugBacktrace[0]['file'].'`</span> on line <strong> `'.$aDebugBacktrace[0]['line'].'`</strong> ';
$this->aCheckpoint[] = array(
'name' => $szAdd.'Finish timer Time =<strong>`'.$fResult.'`</strong><br>'.$szDebugBacktrace,
'time' => ($fTime - $this->fExecStart)
);
}
function addAlert($msg) {
$this->aAlert[] = htmlspecialchars($msg);
}
/**
* @desc Добавляет в дебуг сведения об использовании времени
* @return
*/
function addMemoryUsage() {
if (is_callable('memory_get_usage')) {
$this->addProperty('<br>Количество использованной памяти:'.memory_get_usage ()."\r\n");
}
}
/**
* @desc Очищает сессию от старых дебугов
* @return
*/
function clearOldDebugs() {
while (count($_SESSION['__trace']) >= DEBUG_COUNT)
array_shift($_SESSION['__trace']);
}
function addIncludedFiles() {
$szContent = print_r(get_included_files(),true);
$this->addDebug('CTrace','Включенные файлы : <br>'."\r\n<p align=left> ".str_replace("\r\n",'<br>',$szContent).'</p>');
}
function addOS() {
$this->addProperty('ОС: <br>'."\r\n".print_r(php_uname(),true).'<Br>'."\r\n");
}
function addCurrentUser() {
$this->addProperty('Текущий пользователь: <br>'."\r\n".print_r(get_current_user(),true).'<Br>'."\r\n");
}
function addCurrentScript() {
$this->addProperty('Текущий скрипт: '.$_SERVER['SCRIPT_NAME'].'<br>'."\r\n");
}
/**
* @desc
* @return
*/
function addCheckPoint($message) {
if (DEBUG == 0) return;
$aTmp = explode(' ',microtime());
$nTime = floatval($aTmp[0]) *1000 + 1000 * intval($aTmp[1]);
$this->aCheckpoint[] = array(
'name' => htmlspecialchars($message),
'time' => $nTime - $this->fExecStart
);
}
/**
* @desc Возвращаем HTML-код списка свойств на вывод
* @return
*/
function outputProperty() {
$aResult = array();
foreach ($this->aProperty as $value)
$aResult[] = sprintf($this->szTemplateProperty,$value);
$szResult = implode("\r\n",$aResult);
$szResult = sprintf($this->szTemplatePropertyList,$szResult);
return $szResult;
}
function outputMessages() {
$aResult = array();
foreach ($this->aMessages as $value)
$aResult[] = sprintf($this->szTemplateMessage,$value['ID'],$value['NAME'],$value['TIME'],
isset($value['FROM_BEGIN_TIME'])?$value['FROM_BEGIN_TIME']:'');
$szResult = implode("\r\n",$aResult);
$szResult = sprintf($this->szTemplateMessageList,$szResult);
return $szResult;
}
function outputOldDebugs() {
$aResult = array();
foreach ($_SESSION['__trace'] as $value)
$aResult[] = sprintf($this->szTemplateOldDebug,$value);
$szResult = implode("\r\n",$aResult);
$szResult = sprintf($this->szTemplateOldDebugList,$szResult);
return $szResult;
}
/**
* @desc Возвращает строку с алертами (java script:alert) для пользователя
Алерты хранятся во внутреннем массиве $this->aAlert. Один элемент этого
массива, одно сообщение пользователю
* @return string
*/
function outputAlerts() {
$szResult = '';
foreach ($this->aAlert as $key=>$value) {
$szResult .= sprintf($this->szTemplateAlert,$value)."\r\n";
unset($this->aAlert[$key]);
}
return $szResult;
}
/**
* @desc
* @return
*/
function outputCheckPoints() {
$szResult = '';
for ($i = 0; $i < sizeof($this->aCheckpoint);$i++) {
$szResult .= sprintf($this->szTemplateCheckpoint,
$this->aCheckpoint[$i]['name'],$this->aCheckpoint[$i]['time']);
}
$szResult = sprintf($this->szTemplateCheckpointList,$szResult);
return $szResult;
}
/**
* @desc Выводит все комманды по категориямы
* @return
*/
function outputCategory() {
$szResult = '';
foreach ($this->aCategory as $key=>$value) {
$szCategory = '';
$fResult = 0;
// перебор значений внутри категории
foreach ($value as $key2=>$value2) {
$fResult += !empty($value2['time'])?$value2['time']:0;
// формируем строку
$szCategory .= sprintf($this->szTemplateCategory,@$value2['message'],@$value2['from_begin_time']);
}
// подсчитываем итого
$itogo = array(
'message' => 'Итого',
'time' => $fResult
);
$szCategory .= sprintf($this->szTemplateCategory,$itogo['message'],$itogo['time'],0);
$szResult .= sprintf($this->szTemplateCategoryList,next($this->aColors),$key,$szCategory);
}
return $szResult;
}
/**
* @desc Вывод окошка дебуг
* @return string Код окна
*/
function makeDebug() {
$szResult = $this->outputAlerts();
if (DEBUG == 1) {
$this->addSessionAndCookie();
global $parser;
// удаление старых ненужных дебугов
$this->clearOldDebugs();
// формирование дебуга, добавляем доп. св-ва
$this->finishProgram();
$this->addIncludedFiles();
$this->addOS();
$this->addCurrentUser();
$this->addCurrentScript();
$szResult .= $this->outputProperty();
$szResult .= $this->outputMessages();
$szResult .= $this->outputCheckpoints();
$szResult .= $this->outputCategory();
// Добавляем фразу Debug at...
if (isset($_SERVER['SCRIPT_NAME'])) {
$_SESSION['__trace'][] = '<h1>Debug at:'.$_SERVER['SCRIPT_NAME'].'</h1><br>'.$szResult;
}
$szResult .= $this->outputOldDebugs();
// если определена директива DEBUG_FILE, то выводим дебуг в файл
if (defined('DEBUG_FILE')) {
$f_header = fopen(DEBUG_FILE,'w');
fputs($f_header,$szResult);
fclose($f_header);
return ' ';
}
//
$szResult = sprintf($this->szTemplateOutput,$szResult);
}
return $szResult;
}
/**
* @desc Добавляет в вывод списка операций _SESSION и _COOKIE
* @return
*/
function addSessionAndCookie() {
// Добавление сессии
foreach ($_SESSION as $k => $v)
if (($k !== '__trace') && ($k != 'old_debug')){
$szTmp = print_r($v,true);
$this->aCategory['Session'][] = array(
'message' => 'SESSION['.$k.'] ::: '.str_replace("\n",'<br>',$szTmp)
);
}
// Добавление куков
foreach ($_COOKIE as $k => $v) {
$this->aCategory['Cookie'][] = array(
'message' => 'COOKIE['.$k.'] ::: '.str_replace("\n",'<br>',print_r($v,true))
);
}
}
/**
* @desc Добавляет в список операций _FILES _POST _GET
* @return
*/
function addRequest() {
// записываем в DEBUG массивы _FILES _POST _GET
foreach ($_FILES as $k => $v) {
$szTmp = print_r($v,true);
$this->aCategory['FILES'][] = array(
'message' => 'FILES['.$k.'] ::: '.str_replace("\n",'<br>',$szTmp)
);
}
foreach ($_POST as $k => $v) {
$szTmp = print_r($v,true);
$this->aCategory['POST'][] = array(
'message' => 'POST['.$k.'] ::: '.str_replace("\n",'<br>',$szTmp)
);
}
foreach ($_GET as $k => $v) {
$szTmp = print_r($v,true);
$this->aCategory['GET'][] = array(
'message' => 'GET['.$k.'] ::: '.str_replace("\n",'<br>',$szTmp)
);
}
}
function addError($cat = '',$msg = '') {
$this->addDebug($cat,'<span style="color:darkRed;font-weight:bold">'.$msg.'</span>');
}
/**
* @desc Добавляет сообщение в окошко дебуга
* @param $cat string Категория куда добавить
* @param $msg string Сообщение которое следует добавить
*/
function addDebug($cat="",$msg="") {
// если дебуг включен, то работаем
if (DEBUG == 1) {
// если один из параметров пуст генерируем ошибку
if (($cat == '') || ($msg == ''))
die('CTrace::addDebug Cat='.$cat.' Msg='.$msg.' Одно из значений отсутствует' );
$aTmp = explode(' ',microtime());
$nTime = floatval($aTmp[0]) *1000 + 1000 * intval($aTmp[1]) - $this->fExecStart;
$this->aCategory[$cat][] = array(
'message' => $msg,
'from_begin_time'=> $nTime
);
$aDebugBacktrace = debug_backtrace();
$szDebugBacktrace = '<span style="color:white;" >File `'.$aDebugBacktrace[0]['file'].'` on line `'.$aDebugBacktrace[0]['line'].'` </span>';
$this->aMessages[] = array(
'TIME' => date('H\:i\:s'),
'FROM_BEGIN_TIME' => $nTime,
'NAME' => $cat .' ::: '.$msg.'<br>'.$szDebugBacktrace,
'ID' => count($this->aMessages) + 1
);
}
}
function addProperty($szValue) {
if (DEBUG == 1) {
$this->aProperty[] = $szValue;
$this->aMessages[] = array(
'TIME' => date('H\:i\:s'),
'NAME' => $szValue.'<br>',
'ID' => count($this->aMessages) + 1
);
}
}
/**
* @desc Добалвяет страницу в хистори
*/
function addBack($szBack=DEFAULT_BACK) {
if (empty($_SESSION['__backpage']))
$_SESSION['__backpage'] = array();
if (empty($_SESSION['__backpage'][$szBack]) || (!is_array($_SESSION['__backpage'][$szBack])))
$_SESSION['__backpage'][$szBack] = array();
// Определение урл для добавления в хистори. Если URI пуст, будет записано имя скрипта
$szAdd = ($_SERVER['REQUEST_URI'] != '')?$_SERVER['REQUEST_URI']:$_SERVER['SCRIPT_FILENAME'];
if (end($_SESSION['__backpage'][$szBack]) != $szAdd)
$_SESSION['__backpage'][$szBack][] = $szAdd;
if (count($_SESSION['__backpage'][$szBack]) > 50)
array_shift($_SESSION['__backpage'][$szBack]);
}
/**
* @desc Удаляет последнюю страницу из списка бэков
*/
function removeBack($szBack = DEFAULT_BACK) {
if (isset($_SESSION['__backpage'][$szBack]) && is_array($_SESSION['__backpage'][$szBack])
&& sizeof($_SESSION['__backpage'][$szBack]) > 1) {
array_pop($_SESSION['__backpage'][$szBack]);
}
}
}
?>
Примеры работы :
Базовый пример старта работы
Код:
<?
error_reporting(E_ALL);
define('DEBUG',1);
include 'trace.class.php';
$trace = new CTrace();
$trace->addCheckpoint('program start');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<h1> Перед вами базовый тест проверки работы класса </h1>
<p> Нажмите Ctrl+~ чтобы увидеть результат трейсинга этой простой страницы</p>
</BODY>
</HTML>
<?
$trace->addCheckpoint('program finish');
print $trace->makeDebug();
?>
Балуемся с командами startTimer и endTimer
Код:
<?
////////////////////////////////////////////////////////////////
function loopBillion() {
global $trace;
$trace->startTimer();
for ($i = 0; $i < 1000000;$i++) {
$x = sin($i) * cos($i);
}
$trace->finishTimer();
$trace->addDebug('Выполнение мат задач','Вычисление миллиона операци sin(x)*cos(x)');
}
////////////////////////////////////////////////////////////////
error_reporting(E_ALL);
define('DEBUG',1);
include 'trace.class.php';
global $trace;
$trace = new CTrace();
$trace->addCheckpoint('program start');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<h1> Это второй тест</h1>
</BODY>
</HTML>
<?
$trace->startTimer('Test loops');
$trace->addCheckpoint('loop billion');
loopBillion();
$trace->addCheckpoint('loop billion2');
loopBillion();
$trace->addCheckpoint('program finish');
$trace->finishTimer();
print $trace->makeDebug();
?>
Работаем с категориями и командами addDebug addError
Код:
<?
error_reporting(E_ALL);
define('DEBUG',1);
include 'trace.class.php';
// стартует работу
$trace = new CTrace();
$trace->addCheckpoint('program start');
//
$trace->addDebug('Category1','Test message');
$trace->addDebug('Category1','Another test');
$trace->addDebug('Category1','yet, Another test');
$trace->addDebug('Category2','Test message');
$trace->addError('Category2','Some error occupied!');
$trace->addError('Category2','Another error!');
$trace->addDebug('Category3','Some message');
$trace->addDebug('SQL','SELECT * FROM `user_account` WHERE `id` = 15 ');
// завершаем работу и выводим дебуг
$trace->addCheckpoint('program finish');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<h1> Тестируем работу с категориями</h1>
</BODY>
</HTML>
<?
print $trace->makeDebug();
?>
Работаем с командами addAlert
Код:
<?
error_reporting(E_ALL);
define('DEBUG',1);
include 'trace.class.php';
$trace = new CTrace();
$trace->addCheckpoint('program start');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<h1> Перед вами базовый тест проверки работы класса </h1>
<p> Нажмите Ctrl+~ чтобы увидеть результат трейсинга этой простой страницы</p>
</BODY>
</HTML>
<?
$trace->addAlert('Warning!!!');
$trace->addAlert('Your program work correctly!!!');
$trace->addCheckpoint('program finish');
print $trace->makeDebug();
?>