Kezdő lépések Tracyvel

A Tracy könyvtár egy hasznos segédprogram a mindennapi PHP programozók számára. Segít a következőkben:

  • a hibák gyors felismerésében és kijavításában
  • a hibák naplózása
  • változók dumpolása
  • a szkriptek/lekérdezések végrehajtási idejének mérése
  • a memóriafogyasztás megtekintése

A PHP tökéletes nyelv a nehezen észrevehető hibák készítésére, mert nagy rugalmasságot biztosít a programozóknak. A Tracy\Debugger emiatt még értékesebb. Ez egy végső eszköz a diagnosztikai eszközök között. Ha először találkozol Tracyvel, hidd el, az életed kezd kettéválni egy Tracy előtti és egy vele való életre. Üdvözöljük a jó résznél!

Telepítés és követelmények

A Tracy telepítésének legjobb módja a legújabb csomag letöltés vagy a Composer használata:

composer require tracy/tracy

Alternatívaként letöltheti a teljes csomagot vagy a tracy.phar fájlt.

Használat

Tracy aktiválása egyszerű. Egyszerűen add hozzá ezt a két kódsort, lehetőleg közvetlenül a könyvtár betöltése után (mint a require 'vendor/autoload.php'), és mielőtt bármilyen kimenetet elküldenél a böngészőnek:

use Tracy\Debugger;

Debugger::enable();

Az első dolog, amit a weboldalon észre fog venni, egy Tracy sáv.

(Ha nem lát semmit, az azt jelenti, hogy a Tracy termelési üzemmódban fut. Biztonsági okokból a Tracy csak a localhoston látható. A enable() metódus első paramétereként a Debugger::Development átadásával kényszerítheti a Tracy-t fejlesztési módban való futtatásra).

A enable() a hibajelentési szint E_ALL-ra történő módosítását foglalja magában.

Tracy Bar

A Tracy Bar egy lebegő panel. Az oldal jobb alsó sarkában jelenik meg. Az egérrel mozgatható. Az oldal újratöltése után megjegyzi a pozícióját.

Más hasznos paneleket is hozzáadhat a Tracy Barhoz. Érdekeseket találhatsz az addonokban, vagy létrehozhatod a sajátodat.

Ha nem szeretné megjeleníteni a Tracy Bar-t, állítsa be:

Debugger::$showBar = false;

Hibák és kivételek megjelenítése

Bizonyára tudod, hogyan jelzi a PHP a hibákat: az oldal forráskódjában van valami ilyesmi:

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

vagy el nem fogott kivétel:

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

Nem olyan könnyű eligazodni ebben a kimenetben. Ha engedélyezi a Tracy funkciót, mind a hibák, mind a kivételek teljesen más formában jelennek meg:

A hibaüzenet szó szerint ordít. Látható a forráskód egy része a kiemelt sorral, ahol a hiba előfordult. Az üzenet világosan megmagyarázza a hibát. Az egész oldal interaktív, próbálja ki.

És tudod mit? A végzetes hibákat ugyanígy rögzíti és megjeleníti. Nem kell semmilyen bővítményt telepíteni (kattintson az élő példa megtekintéséhez):

Az olyan hibák, mint például egy változó nevének elírása vagy egy nem létező fájl megnyitásának kísérlete E_NOTICE vagy E_WARNING szintű jelentéseket generál. Ezek könnyen figyelmen kívül hagyhatók és/vagy teljesen elrejthetők egy weboldal grafikai elrendezésében. Hagyja, hogy a Tracy kezelje ezeket:

Vagy hibaként jelenhetnek meg:

Debugger::$strictMode = true; // minden hiba megjelenítése
Debugger::$strictMode = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED; // minden hiba, kivéve az elévült hibaüzeneteket.

Az objektumhoz rendeléskor a helyesírási hibák felismerésére a Nette\SmartObject tulajdonságot használjuk.

Gyártási mód és hibanaplózás

Amint láthatod, Tracy elég ékesszóló. Fejlesztői környezetben értékelhető, de egy termelő szerveren katasztrófát okozna. Ott semmilyen hibakeresési információ nem szerepelhet. Ezért a Tracy rendelkezik egy környezet automatikus felismerő és naplózó funkcióval. Ahelyett, hogy megmutatná magát, Tracy egy naplófájlba tárolja az információkat, és egy felhasználó számára érthető szerverhibaüzenetet mutat a látogatónak:

A termelési kimeneti mód elnyom minden hibakeresési információt, amelyet a dump() segítségével küld ki, és természetesen a PHP által generált összes hibaüzenetet. Tehát, még ha el is felejted a dump($obj) címet a forráskódban, a termelő szerveren nem kell aggódnod emiatt. Semmi sem lesz látható.

A kimeneti módot a Debugger::enable() első paramétere határozza meg. A Debugger::Production vagy a Debugger::Development konstans megadható. Másik lehetőség, hogy úgy állítsuk be, hogy a fejlesztési mód akkor legyen bekapcsolva, ha az alkalmazást egy meghatározott IP-címről érik el a tracy-debug cookie meghatározott értékével. Az ehhez használt szintaxis a cookie-value@ip-address.

Ha nincs megadva, akkor az alapértelmezett Debugger::Detect értéket használjuk. Ebben az esetben a rendszer az IP-cím alapján érzékeli a kiszolgálót. A termelési módot választja, ha egy alkalmazás nyilvános IP-címen keresztül érhető el. A helyi IP-cím a fejlesztési módhoz vezet. A legtöbb esetben nincs szükség a mód beállítására. Az üzemmód helyesen kerül felismerésre, ha az alkalmazást a helyi kiszolgálón vagy a termelésben indítja el.

Termelési üzemmódban a Tracy automatikusan rögzíti az összes hibát és kivételt egy szöveges naplóba. Hacsak nem ad meg mást, a log/error.log fájlban tárolja. Ez a hibanaplózás rendkívül hasznos. Képzelje el, hogy az alkalmazás minden felhasználója valójában bétatesztelő. Ők ingyen végeznek élvonalbeli munkát a hibák vadászata során, és butaság lenne, ha értékes jelentéseiket észrevétlenül kidobnád a kukába.

Ha saját üzeneteket vagy elkapott kivételeket kell naplóznod, használd a log() módszert:

Debugger::log('Váratlan hiba'); // szöveges üzenet

try {
	criticalOperation();
} catch (Exception $e) {
	Debugger::log($e); // log kivétel
	// vagy
	Debugger::log($e, Debugger::ERROR); // e-mail értesítést is küld.
}

Az enable() metódus második paraméterével beállítható a hibák naplózására szolgáló könyvtár:

Debugger::enable(Debugger::Detect, __DIR__ . '/mylog');

Ha azt szeretné, hogy a Tracy naplózza a PHP hibákat, mint például a E_NOTICE vagy a E_WARNING részletes információkkal (HTML jelentés), akkor állítsa be a Debugger::$logSeverity értéket:

Debugger::$logSeverity = E_NOTICE | E_WARNING;

Egy igazi szakember számára a hibanapló fontos információforrás, és minden új hibáról azonnal értesülni akar. A Tracy segít neki ebben. Képes arra, hogy minden új hibajegyzékről e-mailt küldjön. A $email változó azonosítja, hogy hova küldje ezeket az e-maileket:

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

Ha a teljes Nette keretrendszert használja, akkor ezt és másokat is beállíthat a konfigurációs fájlban.

Hogy megvédje az e-mail postafiókját az elárasztástól, a Tracy csak egy üzenetet küld, és létrehoz egy fájlt: email-sent. Amikor egy fejlesztő megkapja az e-mail értesítést, ellenőrzi a naplót, kijavítja az alkalmazását, és törli a email-sent felügyeleti fájlt. Ez újra aktiválja az e-mail küldést.

Fájlok megnyitása a szerkesztőben

Amikor a hibaoldal megjelenik, a fájlnevekre kattintva megnyílnak a szerkesztőprogramban, a kurzor a megfelelő soron lesz. A fájlokat létre is lehet hozni (művelet create file) vagy hibát javítani bennük (művelet fix it). Ehhez a böngészőt és a rendszert kell beállítani.

Támogatott PHP-verziók

Tracy kompatibilis a PHP-vel
Tracy 2.10 – 3.0 PHP 8.0 – 8.2
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

A legújabb javítási verziókra vonatkozik.

Portok

Ez egy lista a más keretrendszerek és CMS-ek nem hivatalos portjairól: