• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Профилизатор

  • Автор темы Gisma
  • Дата начала
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 работают со стеком, поэтому они могут следовать одна за другой соблюдая вложенность :
Код:
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();
?>
 
G

Gisma

Примеры работы класса лежат здесь,



Здесь же лежит и сам класс :
 
A

Andrew Stephanoff

А какое практическое применение этого класса?
 
G

Gisma

Значит я недостаточно корректно написал. Представь у тебя мегабайтовый фреймворк (у нас чуть меньше весом, недавно обрезали) Теперь представь какой-то класс сообщает об ошибке, ты в отладчике будешь лазить смотреть откуда она вылезла? Профилизатор здесь средство диагностики, он отображает сообщения классов об ошибках, сообщения об состояниях.
Теперь представь страница выполняется дииииико долго, как ты еще узнаешь где заторможенность, кроме как в профилизаторе?:p
 
G

GOsha

Он не будет работать в браузере MAXTHON, ибо там используется Ctrl для блокировки всплывающих окон. Как минимум нужно линк продублировать живьем.
 
M

MMX

Значит я недостаточно корректно написал. Представь у тебя мегабайтовый фреймворк (у нас чуть меньше весом, недавно обрезали) Теперь представь какой-то класс сообщает об ошибке, ты в отладчике будешь лазить смотреть откуда она вылезла? Профилизатор здесь средство диагностики, он отображает сообщения классов об ошибках, сообщения об состояниях.
Теперь представь страница выполняется дииииико долго, как ты еще узнаешь где заторможенность, кроме как в профилизаторе?:blink:

В качестве профайлера я бы заюзал Zend Platform ;-) Ибо вставка прямых вызовов этого класса в продакшн код - дело неблагодарное.

А если какой-то класс говорит об ошибке - вероятно это будет Exception. Нет? :)
 
G

Gisma

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!