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/UI/Sign/SignPresenter.php(21): App\Forms\SignFormFactory->create() #3 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(181): App\UI\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
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.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 najnovejše različice popravkov.
Pristanišča
To je seznam neuradnih portov za druga ogrodja in 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