Първи стъпки с Tracy
Библиотеката Tracy е полезен ежедневен помощник на PHP програмиста. Ще ви помогне да:
- бързо откривате и коригирате грешки
- логвате грешки
- извеждате променливи
- измервате времето на скриптове и заявки към базата данни
- следите изискванията за памет
PHP е език, създаден за допускане на трудно откриваеми грешки, тъй като дава на разработчиците значителна свобода. Толкова по-ценен е инструментът за дебъгване Tracy. Сред диагностичните инструменти за PHP той представлява абсолютния връх.
Ако днес се срещате с Tracy за първи път, повярвайте, че животът ви ще започне да се дели на този преди Tracy и този с нея. Добре дошли в по-добрата част!
Инсталация
Най-добрият начин да инсталирате Tracy е да изтеглите най-новия пакет или да използвате Composer:
composer require tracy/tracy
Можете също да изтеглите целия пакет като файл tracy.phar.
Използване
Активираме Tracy чрез извикване на метода Tracy\Debugger::enable()
възможно
най-рано в началото на програмата, преди изпращането на какъвто и да
е изход:
use Tracy\Debugger;
require 'vendor/autoload.php'; // или tracy.phar
Debugger::enable();
Първото нещо, което ще забележите на страницата, е Tracy Bar в долния
десен ъгъл. Ако не го виждате, това може да означава, че Tracy работи в
продукционен режим. От съображения за сигурност Tracy е видима само на
localhost. За да тествате дали работи, можете временно да я превключите в
режим на разработка с помощта на параметъра
Debugger::enable(Debugger::Development)
.
Tracy Bar
Tracy Bar е плаващ панел, който се показва в долния десен ъгъл на страницата. Можем да го преместваме с мишката и след презареждане на страницата той ще запомни позицията си.

Към Tracy Bar могат да се добавят други полезни панели. Много от тях можете да намерите в добавките или дори можете да напишете свои собствени.
Ако не искате да показвате Tracy Bar, задайте:
Debugger::$showBar = false;
Визуализация на грешки и изключения
Със сигурност знаете добре как PHP съобщава за грешки: в изходния код на страницата извежда нещо такова:
Parse error: syntax error, unexpected '}' in HomePresenter.php on line 15
или при неприхванато изключение:
Fatal error: Uncaught Nette\MemberAccessException: Call to undefined method Nette\Application\UI\Form::addTest()? in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php:100 Stack trace: #0 /sandbox/vendor/nette/utils/src/Utils/Object.php(75): Nette\Utils\ObjectMixin::call(Object(Nette\Application\UI\Form), 'addTest', Array) #1 /sandbox/app/Forms/SignFormFactory.php(32): Nette\Object->__call('addTest', Array) #2 /sandbox/app/Presentation/Sign/SignPresenter.php(21): App\Forms\SignFormFactory->create() #3 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(181): App\Presentation\Sign\SignPresenter->createComponentSignInForm('signInForm') #4 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(139): Nette\ComponentModel\Container->createComponent('signInForm') #5 /sandbox/temp/cache/latte/15206b353f351f6bfca2c36cc.php(17): Nette\ComponentModel\Co in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php on line 100
Ориентирането в такъв изход не е никак лесно. Ако включим Tracy, грешката или изключението ще се покажат в съвсем различна форма:

Съобщението за грешка буквално крещи. Виждаме част от изходния код с подчертан ред, където е възникнала грешката, а информацията Call to undefined method Nette\Http\User::isLogedIn() ясно обяснява каква е грешката. Освен това цялата страница е интерактивна, можем да кликваме за повече подробности. Опитайте.
И знаете ли какво? По този начин се прихващат и показват дори фатални грешки. Без необходимост от инсталиране на каквито и да било разширения.

Грешки като печатна грешка в името на променлива или опит за отваряне на несъществуващ файл генерират съобщения от ниво E_NOTICE или E_WARNING. Те лесно могат да бъдат пропуснати в графиката на страницата, дори може изобщо да не са видими (освен ако не погледнете кода на страницата).

Или могат да бъдат показани по същия начин като грешките:
Debugger::$strictMode = true; // покажи всички грешки
Debugger::$strictMode = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED; // всички грешки освен известията за отхвърляне (deprecated)

Забележка: След активиране Tracy променя нивото на докладване на грешки
на E_ALL. Ако искате да промените тази стойност, направете го след
извикването на enable()
.
Режим на разработка срещу продукционен режим
Както виждате, Tracy е доста „приказлива“, което може да се оцени в среда за разработка, докато на продукционен сървър това би причинило истинско бедствие. Там не трябва да се извежда никаква информация за дебъгване. Затова Tracy разполага с автоматично откриване на средата и ако стартираме примера на реален сървър, грешката ще бъде логната вместо показана, а посетителят ще види само разбираемо за потребителя съобщение:

Продукционният режим потиска показването на цялата информация за
дебъгване, която изпращаме навън с помощта на dump(), и разбира се, всички съобщения за грешки,
генерирани от PHP. Така че, ако сте забравили някое dump($obj)
в кода,
не се притеснявайте, нищо няма да се изведе на продукционния сървър.
Как работи автоматичното откриване на режима? Режимът е за
разработка, ако приложението се изпълнява на localhost (т.е. IP адрес
127.0.0.1
или ::1
) и няма налично прокси (т.е. негов HTTP хедър). В
противен случай работи в продукционен режим.
Ако искаме да разрешим режима за разработка и в други случаи,
например за програмисти, достъпващи от конкретен IP адрес, го посочваме
като параметър на метода enable()
:
Debugger::enable('23.75.345.200'); // може да се посочи и масив от IP адреси
Определено препоръчваме да комбинирате IP адреса с бисквитка (cookie). В
бисквитката tracy-debug
съхраняваме таен токен, напр. secret1234
, и
по този начин активираме режима за разработка само за програмисти,
достъпващи от конкретен IP адрес, които имат споменатия токен в
бисквитката:
Debugger::enable('secret1234@23.75.345.200');
Можем също така директно да зададем режима за
разработка/продукционен режим, като използваме константата
Debugger::Development
или Debugger::Production
като параметър на метода
enable()
.
Ако използвате Nette Framework, вижте как да зададете режима за него и той впоследствие ще се използва и за Tracy.
Логване на грешки
В продукционен режим Tracy автоматично записва всички грешки и
прихванати изключения в текстов лог. За да може логването да се
осъществява, трябва да зададем абсолютния път до директорията за
логване в променливата $logDirectory
или да го предадем като втори
параметър на метода enable()
:
Debugger::$logDirectory = __DIR__ . '/log';
Логването на грешки е изключително полезно. Представете си, че всички потребители на вашето приложение всъщност са бета тестери, които безплатно вършат отлична работа в намирането на грешки и бихте направили глупост, ако изхвърлите техните ценни доклади в кошчето за боклук, без да им обърнете внимание.
Ако трябва да логнем собствено съобщение или прихванато от нас
изключение, използваме за това метода log()
:
Debugger::log('Doslo k necekane chybe'); // текстово съобщение
try {
kritickaOperace();
} catch (Exception $e) {
Debugger::log($e); // може да се логва и изключение
// или
Debugger::log($e, Debugger::ERROR); // изпраща и известие по имейл
}
Ако искате Tracy да логва PHP грешки като E_NOTICE
или E_WARNING
с
подробна информация (HTML отчет), задайте Debugger::$logSeverity
:
Debugger::$logSeverity = E_NOTICE | E_WARNING;
За истинския професионалист логът на грешките е ключов източник на информация и той иска да бъде незабавно информиран за всяка нова грешка. Tracy му помага в това, тъй като може да информира за нов запис в лога по имейл. Къде да се изпращат имейлите, определяме с променливата $email:
Debugger::$email = 'admin@example.com';
Ако използвате целия Nette Framework, това и други настройки могат да бъдат зададени в конфигурационния файл.
За да не препълни обаче имейл кутията ви, тя винаги изпраща само
едно съобщение и създава файл email-sent
. След получаване на
известието по имейл, разработчикът проверява лога, коригира
приложението и изтрива файла за наблюдение, с което отново се активира
изпращането на имейли.
Отваряне в редактор
При показване на страницата с грешка можете да кликнете върху
имената на файловете и те ще се отворят във вашия редактор с курсора на
съответния ред. Също така можете да създавате файлове (действие
create file
) или да коригирате грешки в тях (действие fix it
). За
да работи това, е достатъчно да конфигурирате браузъра и системата.
Поддържани версии на PHP
Tracy | съвместим с PHP |
---|---|
Tracy 2.10 – 3.0 | PHP 8.0 – 8.4 |
Tracy 2.9 | PHP 7.2 – 8.2 |
Tracy 2.8 | PHP 7.2 – 8.1 |
Tracy 2.6 – 2.7 | PHP 7.1 – 8.0 |
Tracy 2.5 | PHP 5.4 – 7.4 |
Tracy 2.4 | PHP 5.4 – 7.2 |
Важи за последната пач версия.
Портове
Това е списък с неофициални портове за други framework-ове и CMS:
- Drupal 7
- Laravel framework: recca0120/laravel-tracy, whipsterCZ/laravel-tracy
- OpenCart
- ProcessWire CMS/CMF
- Slim Framework
- Symfony framework: kutny/tracy-bundle, VasekPurchart/Tracy-Blue-Screen-Bundle
- Wordpress