Začenjamo s Tracy

Knjižnica Tracy je koristen vsakodnevni pomočnik PHP programerja. Pomagala vam bo:

  • hitro odkriti in popraviti napake
  • dnevniško beležiti napake
  • izpisovati spremenljivke
  • meriti čas izvajanja skript in podatkovnih poizvedb
  • spremljati porabo pomnilnika

PHP je jezik, kot nalašč za ustvarjanje težko odkritih napak, saj daje razvijalcem precejšnjo svobodo. Zato je orodje za razhroščevanje Tracy še toliko bolj dragoceno. Med diagnostičnimi orodji za PHP predstavlja absolutni vrh.

Če se danes prvič srečujete s Tracy, verjemite, da se bo vaše življenje začelo deliti na tisto pred Tracy in tisto z njo. Dobrodošli v boljšem delu!

Namestitev

Najboljši način za namestitev Tracy je prenesti najnovejši paket ali uporabiti Composer:

composer require tracy/tracy

Lahko si prenesete tudi celoten paket kot datoteko tracy.phar.

Uporaba

Tracy aktiviramo s klicem metode Tracy\Debugger::enable() čim prej na začetku programa, pred pošiljanjem kakršnega koli izpisa:

use Tracy\Debugger;

require 'vendor/autoload.php'; // ali tracy.phar

Debugger::enable();

Prva stvar, ki jo boste opazili na strani, je Tracy Bar v spodnjem desnem kotu. Če ga ne vidite, lahko pomeni, da Tracy teče v produkcijskem načinu. Tracy je namreč iz varnostnih razlogov vidna samo na localhostu. Za testiranje, ali deluje, jo lahko začasno preklopite v razvojni način s parametrom Debugger::enable(Debugger::Development).

Tracy Bar

Tracy Bar je lebdeči panel, ki se prikaže v spodnjem desnem kotu strani. Lahko ga premikamo z miško in po ponovnem nalaganju strani si bo zapomnil svoj položaj.

V Tracy Bar lahko dodajate druge koristne panele. Veliko jih najdete v dodatkih ali pa si lahko celo napišete lastne.

Če ne želite prikazovati Tracy Bar, nastavite:

Debugger::$showBar = false;

Vizualizacija napak in izjem

Zagotovo dobro veste, kako PHP sporoča napake: v izvorno kodo strani izpiše nekaj takega:

Parse error:  syntax error, unexpected '}' in HomePresenter.php on line 15

ali pri neujeti izjemi:

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

V takem izpisu se ni ravno lahko znajti. Če vklopimo Tracy, se napaka ali izjema prikaže v povsem drugačni obliki:

Sporočilo o napaki dobesedno kriči. Vidimo del izvorne kode z označenim vrstico, kjer je prišlo do napake, in informacija Call to undefined method Nette\Http\User::isLogedIn() razumljivo pojasnjuje, za kakšno napako gre. Celotna stran je poleg tega živa, lahko se preklikamo do večjih podrobnosti. Poskusite.

In veste kaj? Na ta način ujame in prikaže tudi fatalne napake. Brez potrebe po namestitvi kakršnih koli razširitev.

Napake, kot so tipkarske napake v imenu spremenljivke ali poskus odpiranja neobstoječe datoteke, generirajo sporočila ravni E_NOTICE ali E_WARNING. Te je v grafiki strani lahko spregledati, morda celo sploh niso vidne (razen s pogledom v kodo strani).

Ali pa so lahko prikazane enako kot napake:

Debugger::$strictMode = true; // prikaži vse napake
Debugger::$strictMode = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED; // vse napake razen opozoril o zastarelosti (deprecate)

Opomba: Tracy po aktivaciji spremeni raven poročanja napak na E_ALL. Če želite to vrednost spremeniti, to storite po klicu enable().

Razvojni vs produkcijski način

Kot vidite, je Tracy precej zgovorna, kar je cenjeno v razvojnem okolju, medtem ko bi na produkcijskem strežniku povzročilo pravo katastrofo. Tam se namreč ne smejo izpisati nobene informacije za razhroščevanje. Tracy zato razpolaga z samodejnim zaznavanjem okolja in če primer zaženemo na produkcijskem strežniku, se napaka namesto prikaza zabeleži v dnevnik, obiskovalec pa vidi le uporabniku prijazno sporočilo:

Produkcijski način zatre prikaz vseh informacij za razhroščevanje, ki jih pošiljamo ven s pomočjo dump(), in seveda tudi vseh sporočil o napakah, ki jih generira PHP. Če ste torej v kodi pozabili kakšen dump($obj), vam ni treba skrbeti, na produkcijskem strežniku se ne bo nič izpisalo.

Kako deluje samodejno zaznavanje načina? Način je razvojni, če se aplikacija izvaja na localhostu (tj. IP naslov 127.0.0.1 ali ::1) in ni prisoten proxy (tj. njegova HTTP glava). Sicer teče v produkcijskem načinu.

Če želimo razvojni način omogočiti tudi v drugih primerih, na primer programerjem, ki dostopajo z določenega IP naslova, ga navedemo kot parameter metode enable():

Debugger::enable('23.75.345.200'); // lahko navedete tudi polje IP naslovov

Vsekakor priporočamo kombiniranje IP naslova s piškotkom. V piškotek tracy-debug shranimo skrivni žeton, npr. secret1234, in na ta način aktiviramo razvojni način samo za programerje, ki dostopajo z določenega IP naslova in imajo v piškotku omenjeni žeton:

Debugger::enable('secret1234@23.75.345.200');

Razvojni/produkcijski način lahko neposredno nastavimo tudi z uporabo konstante Debugger::Development ali Debugger::Production kot parametra metode enable().

Če uporabljate Nette Framework, poglejte, kako nastaviti način zanj, ki se bo nato uporabil tudi za Tracy.

Dnevniško beleženje napak

V produkcijskem načinu Tracy samodejno vse napake in ujete izjeme beleži v besedilni dnevnik. Da lahko dnevniško beleženje poteka, moramo nastaviti absolutno pot do imenika za dnevnike v spremenljivko $logDirectory ali jo predati kot drugi parameter metode enable():

Debugger::$logDirectory = __DIR__ . '/log';

Dnevniško beleženje napak je pri tem izjemno koristno. Predstavljajte si, da so vsi uporabniki vaše aplikacije pravzaprav beta testerji, ki brezplačno opravljajo vrhunsko delo pri iskanju napak, in bi naredili neumnost, če bi njihova dragocena poročila brez pozornosti vrgli v koš za smeti.

Če moramo zabeležiti lastno sporočilo ali izjemo, ki ste jo ujeli, za to uporabimo metodo log():

Debugger::log('Prišlo je do nepričakovane napake'); // besedilno sporočilo

try {
	kritickaOperace();
} catch (Exception $e) {
	Debugger::log($e); // beležiti je mogoče tudi izjemo
	// ali
	Debugger::log($e, Debugger::ERROR); // pošlje tudi e-poštno obvestilo
}

Če želite, da Tracy beleži PHP napake, kot sta E_NOTICE ali E_WARNING, s podrobnimi informacijami (HTML poročilo), nastavite Debugger::$logSeverity:

Debugger::$logSeverity = E_NOTICE | E_WARNING;

Za pravega profesionalca je dnevnik napak ključni vir informacij in želi biti takoj obveščen o vsaki novi napaki. Tracy mu pri tem pomaga, saj zna o novem zapisu v dnevniku obvestiti po e-pošti. Kam pošiljati e-pošto, določimo s spremenljivko $email:

Debugger::$email = 'admin@example.com';

Če uporabljate celoten Nette Framework, lahko to in drugo nastavite v konfiguracijski datoteki.

Da pa vam ne bi preplavila e-poštnega predala, vedno pošlje samo eno sporočilo in ustvari datoteko email-sent. Razvijalec po prejemu e-poštnega obvestila preveri dnevnik, popravi aplikacijo in izbriše nadzorno datoteko, s čimer se ponovno aktivira pošiljanje e-pošte.

Odpiranje v urejevalniku

Pri prikazu strani z napako lahko kliknete na imena datotek in te se bodo odprle v vašem urejevalniku s kazalcem na ustrezni vrstici. Prav tako lahko datoteke ustvarjate (akcija create file) ali v njih popravljate napake (akcija fix it). Da bi to delovalo, je dovolj konfigurirati brskalnik in sistem.

Podprte različice PHP

Tracy združljiv s 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

Velja za zadnjo različico popravka.

Porti

To je seznam neuradnih portov za druga ogrodja in CMS: