Začetek dela s Tracyjem

Knjižnica Tracy je uporaben pomočnik za vsakdanje programerje PHP. Pomaga vam pri:

  • hitro odkrijete in popravite napake
  • beleženje napak
  • izpisati spremenljivke
  • merjenje časa izvajanja skript/zahtev
  • pregledati porabo pomnilnika

PHP je odličen jezik za izdelavo težko zaznavnih napak, saj programerjem omogoča veliko prilagodljivost. Tracy\Debugger je zaradi tega še bolj dragocen. Je vrhunsko orodje med diagnostičnimi orodji.

Če se s Tracy srečate prvič, verjemite, da se vaše življenje začne deliti na tisto pred Tracy in tisto z njo. Dobrodošli v dobrem delu!

Namestitev in zahteve

Tracy najbolje namestite tako, da prenesete najnovejši paket ali uporabite Composer:

composer require tracy/tracy

lahko prenesete tudi celoten paket ali datoteko tracy.phar.

Uporaba

Tracy se aktivira s klicem metode `Tracy\Debugger::enable()' čim prej na začetku programa, preden se pošlje kakršen koli izhod:

use Tracy\Debugger;

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

Debugger::enable();

Prva stvar, ki jo boste opazili na strani, je vrstica Tracy v spodnjem desnem kotu. Če je ne vidite, to lahko pomeni, da Tracy deluje v produkcijskem načinu. Tracy je namreč iz varnostnih razlogov viden samo na lokalnem gostitelju. Če želite preizkusiti, ali deluje, ga lahko začasno preklopite v razvojni način z uporabo parametra Debugger::enable(Debugger::Development).

Tracy Bar

Tracy Bar je plavajoča plošča. Prikazana je v spodnjem desnem kotu strani. Premikate jo lahko z miško. Po ponovnem nalaganju strani si bo zapomnila svoj položaj.

V vrstico Tracy lahko dodate druge uporabne plošče. Zanimive lahko najdete v dodatkih ali pa ustvarite svoje.

Če ne želite prikazati Tracy Bar, nastavite:

Debugger::$showBar = false;

Vizualizacija napak in izjem

Zagotovo veste, kako PHP sporoča napake: v izvorni kodi strani je nekaj takega:

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

ali nezajeta izjema:

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/presenters/SignPresenter.php(21): App\Forms\SignFormFactory->create()
#3 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(181): App\Presenters\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

Prehajanje po tem izpisu ni tako enostavno. Če omogočite funkcijo Tracy, so napake in izjeme prikazane v povsem drugačni obliki:

Sporočilo o napaki dobesedno kriči. Vidite lahko del izvorne kode s poudarjeno vrstico, v kateri se je pojavila napaka. Sporočilo jasno pojasnjuje napako. Celotno spletno mesto je interaktivno, poskusite ga.

In veste kaj? Usodne napake so zajete in prikazane na enak način. Ni treba namestiti nobene razširitve (kliknite za primer v živo):

Napake, kot sta tiskarska napaka v imenu spremenljivke ali poskus odpiranja neobstoječe datoteke, ustvarijo poročila ravni E_NOTICE ali E_WARNING. Te napake je mogoče zlahka spregledati in/ali so lahko popolnoma skrite v grafični postavitvi spletne strani. Naj jih upravlja podjetje Tracy:

Lahko pa se prikažejo kot napake:

Debugger::$strictMode = true; // prikaz vseh napak
Debugger::$strictMode = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED; // vse napake, razen zastarelih obvestil

Opomba: Ko je funkcija Tracy aktivirana, se raven poročanja o napakah spremeni na E_ALL. Če želite to spremeniti, to storite po klicu enable().

Razvojni in produkcijski način

Kot lahko vidite, je Tracy precej zgovoren, kar je mogoče ceniti v razvojnem okolju, medtem ko bi na produkcijskem strežniku to povzročilo katastrofo. To pa zato, ker se tam ne bi smele prikazati nobene informacije za odpravljanje napak. Tracy ima zato avtomatsko zaznavanje okolja in če se primer izvaja na strežniku v živo, se napaka namesto prikaza zabeleži, obiskovalec pa vidi le uporabniku prijazno sporočilo:

Proizvodni način onemogoči prikaz vseh informacij za odpravljanje napak, poslanih s funkcijo dump(), in seveda tudi vseh sporočil o napakah, ki jih ustvari PHP. Če ste v kodi pozabili na kakšen dump($obj), vam ni treba skrbeti, saj se v produkcijskem strežniku ne bo nič prikazalo.

Kako deluje samodejno zaznavanje načina? Način je razvojni, če aplikacija teče na lokalnem gostitelju (tj. naslovu IP 127.0.0.1 ali ::1) in ni posrednika (tj. njegove glave HTTP). V nasprotnem primeru deluje v produkcijskem načinu.

Če želite omogočiti razvojni način v drugih primerih, na primer za razvijalce, ki dostopajo z določenega naslova IP, ga lahko določite kot parameter metode enable():

Debugger::enable('23.75.345.200'); // zagotovite lahko tudi niz naslovov IP.

Vsekakor priporočamo kombinacijo naslova IP s piškotkom. V piškotek tracy-debug shranite tajni žeton, na primer secret1234, in na ta način aktivirajte razvojni način samo za razvijalce, ki dostopajo z določenega naslova IP in imajo omenjeni žeton v piškotku:

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

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

Če uporabljate ogrodje Nette Framework, si oglejte, kako zanj nastaviti način, ki se bo nato uporabljal tudi za Tracy.

Beleženje napak

V produkcijskem načinu Tracy samodejno beleži vse napake in izjeme v besedilni dnevnik. Da bi se beleženje izvajalo, morate v spremenljivko $logDirectory nastaviti absolutno pot do imenika dnevnika ali jo posredovati kot drugi parameter metodi enable():

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

Beleženje napak je zelo uporabno. Predstavljajte si, da so vsi uporabniki vaše aplikacije pravzaprav beta testerji, ki brezplačno opravljajo vrhunsko delo pri iskanju napak, in neumno bi bilo, če bi njihova dragocena poročila neopaženo vrgli v koš za smeti.

Če morate zabeležiti svoja sporočila ali ujete izjeme, uporabite metodo log():

Debugger::log('Unexpected error'); // besedilno sporočilo

try {
	criticalOperation();
} catch (Exception $e) {
	Debugger::log($e); // izjema v dnevniku
	// ali
	Debugger::log($e, Debugger::ERROR); // pošlje tudi e-poštno obvestilo
}

If you want Tracy to log PHP errors like E_NOTICE or E_WARNING with detailed information (HTML report), set Debugger::$logSeverity:

Debugger::$logSeverity = E_NOTICE | E_WARNING;

Za pravega strokovnjaka je dnevnik napak ključni vir informacij in želi biti takoj obveščen o vsaki novi napaki. Tracy mu pri tem pomaga. Sposobna je poslati e-poštno sporočilo za vsak nov zapis o napaki. Spremenljivka $email določa, kam naj se ta e-poštna sporočila pošljejo:

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

Če uporabljate celotno ogrodje Nette, lahko to in druge nastavite v konfiguracijski datoteki.

Za zaščito e-poštnega predala pred poplavo Tracy pošlje pougo eno sporočilo in ustvari datoteko email-sent. Ko razvijalec prejme e-poštno obvestilo, preveri dnevnik, popravi svojo aplikacijo in izbriše datoteko za spremljanje email-sent. S tem se ponovno aktivira pošiljanje e-pošte.

Odpiranje datotek v urejevalniku

Ko je prikazana stran z napako, lahko kliknete na imena datotek in te se bodo odprle v urejevalniku s kazalcem na ustrezni vrstici. Datoteke lahko tudi ustvarite (dejanje create file) ali v njih odpravite napake (dejanje fix it). Da bi to lahko storili, morate konfigurirati brskalnik in sistem.

Podprte različice PHP

Tracy združljivo s PHP
Tracy 2.10 – 3.0 PHP 8.0 – 8.3
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 najnovejše različice popravkov.

Pristanišča

To je seznam neuradnih portov za druga ogrodja in CMS: