Zaczynając od Tracy

Biblioteka Tracy, która została udomowiona pod nazwą Laddy, to przydatny na co dzień pomocnik programisty PHP. To ci pomoże:

  • szybkie wykrywanie i naprawianie błędów
  • błędy w dzienniku
  • wyciągnąć zmienne
  • mierzyć czas wykonywania skryptów i zapytań do bazy danych
  • monitorować wymagania dotyczące pamięci

PHP jest językiem z wyboru do siekania trudnych do wykrycia błędów, ponieważ daje programistom dużą swobodę. Jeszcze cenniejsze jest narzędzie do debugowania Tracy. Wśród narzędzi diagnostycznych PHP to absolutna czołówka.

Jeśli dziś po raz pierwszy spotykasz się z Biedronką, to lepiej uwierz, że Twoje życie zacznie się dzielić na to przed Biedronką i to z Biedronką. Witamy w dobrej części!

Instalacja

Najlepszym sposobem na zainstalowanie Tracy jest pobranie najnowszego pakietu, lub użyty Composer:

composer require tracy/tracy

Możesz również pobrać cały pakiet jako plik tracy.phar.

Zastosowanie

Tracy aktywuje się poprzez wywołanie metody `TracyDebugger::enable()' jak najszybciej na początku programu, przed wysłaniem jakiegokolwiek wyjścia:

use Tracy\Debugger;

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

Debugger::enable();

Pierwszą rzeczą, którą zauważysz na stronie, jest pasek Tracy w prawym dolnym rogu. Jeśli go nie widzisz, może to oznaczać, że Tracy działa w trybie produkcyjnym. Dzieje się tak, ponieważ Tracy jest widoczny tylko na localhost ze względów bezpieczeństwa. Aby przetestować, czy działa, możesz tymczasowo przełączyć go w tryb deweloperski za pomocą parametru Debugger::enable(Debugger::Development).

Tracy Bar

Tracy Bar to pływający pasek, który pojawia się w prawym dolnym rogu strony. Można go przesuwać za pomocą myszy i będzie pamiętał swoją pozycję po ponownym załadowaniu strony.

Do Tracy Bar można dodać inne przydatne panele. Wiele z nich można znaleźć w dodatkach, a nawet napisać własne.

Jeśli nie chcesz wyświetlać paska Tracy Bar, ustaw:

Debugger::$showBar = false;

Wizualizacja błędów i wyjątków

Wiesz, jak PHP zgłasza błędy: drukuje coś takiego w kodzie źródłowym strony:

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

lub gdy wyjątek nie zostanie złapany:

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

Poruszanie się po takim zestawieniu nie jest łatwe. Jeśli włączysz Label, błąd lub wyjątek zostanie wyświetlony w innej formie:

Komunikat o błędzie dosłownie krzyczy. Widzimy fragment kodu źródłowego z podświetloną linią, w której wystąpił błąd, a informacja *Call to undefined method Nette\Security\User::isLoggedIn() jasno wyjaśnia, na czym polega błąd. Co więcej, cała strona jest na żywo, możemy przeklikać się do większej ilości szczegółów. Spróbuj.

I wiesz co? Pozwoli to na wychwycenie i wyświetlenie nawet fatalnych błędów. Bez konieczności instalowania jakichkolwiek rozszerzeń.

Błędy takie jak literówka w nazwie zmiennej lub próba otwarcia nieistniejącego pliku generują komunikat poziomu E_NOTICE lub E_WARNING. Można je łatwo przeoczyć w grafice strony, a może nawet w ogóle nie być widoczne (chyba, że patrząc na kod strony).

Mogą też być wyświetlane tak jak błędy:

Debugger::$strictMode = true; // pokaż wszystkie błędy
Debugger::$strictMode = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED; // wszystkie błędy z wyjątkiem powiadomień deprecate.

Uwaga: Tracy po aktywacji zmienia poziom raportowania błędów na E_ALL. Jeśli chcesz to zmienić, zrób to po wywołaniu enable().

Tryb deweloperski a produkcyjny

Jak widać, Tracy jest dość gadatliwy, co można docenić w środowisku deweloperskim, natomiast na serwerze produkcyjnym spowodowałoby to katastrofę. Dzieje się tak dlatego, że nie powinny być tam wyświetlane żadne informacje o debugowaniu. Tracy posiada zatem automatyczne wykrywanie środowiska i jeśli przykład zostanie uruchomiony na serwerze produkcyjnym, błąd zostanie zapisany w dzienniku zamiast wyświetlony, a odwiedzający zobaczy jedynie przyjazny dla użytkownika komunikat:

Tryb produkcyjny wyłącza wyświetlanie wszystkich informacji o debugowaniu wysyłanych za pomocą dump(), a także oczywiście wszystkich komunikatów o błędach generowanych przez PHP. Jeśli więc zapomniałeś o jakimś dump($obj) w kodzie, nie musisz się martwić, na serwerze produkcyjnym nic nie zostanie wyświetlone.

Jak działa autodetekcja trybu? Tryb jest rozwojowy, jeśli aplikacja działa na localhost (czyli adres IP 127.0.0.1 lub ::1) i nie ma proxy (czyli jego nagłówka HTTP). W przeciwnym razie działa w trybie produkcyjnym.

Jeżeli chcesz włączyć tryb development w innych przypadkach, np. dla deweloperów uzyskujących dostęp z określonego adresu IP, możesz go określić jako parametr metody enable():

Debugger::enable('23.75.345.200'); // można również podać tablicę adresów IP

Zdecydowanie zalecamy połączenie adresu IP z plikiem cookie. Przechowuj tajny token, np. secret1234, w pliku cookie tracy-debug i w ten sposób włączaj tryb deweloperski tylko dla deweloperów uzyskujących dostęp z określonego adresu IP, którzy mają wspomniany token w pliku cookie:

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

Możesz również bezpośrednio ustawić tryb deweloperski/produkcyjny za pomocą stałych Debugger::Development lub Debugger::Production jako parametru metody enable().

Jeśli używasz Nette Framework, spójrz na to, jak ustawić tryb dla niego, a następnie będzie on również używany dla Tracy.

Rejestrowanie błędów

W trybie produkcyjnym Tracy automatycznie loguje wszystkie błędy i wyjątki do dziennika tekstowego. Aby logowanie miało miejsce, należy ustawić bezwzględną ścieżkę do katalogu logów w zmiennej $logDirectory lub przekazać ją jako drugi parametr metody enable():

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

Rejestrowanie błędów jest niezwykle przydatne. Wyobraź sobie, że wszyscy użytkownicy Twojej aplikacji to tak naprawdę beta testerzy, którzy za darmo wykonują najwyższej klasy pracę polegającą na wyszukiwaniu błędów, a Ty byłbyś głupi, gdybyś wyrzucił ich cenne raporty niepostrzeżenie do kosza na śmieci.

Jeśli musimy zarejestrować niestandardowy raport lub wyjątek złapany przez użytkownika, używamy do tego metody log():

Debugger::log('Wystąpił nieoczekiwany błąd'); // komunikat tekstowy

try {
	kritickaOperace();
} catch (Exception $e) {
	Debugger::log($e); // można również rejestrować wyjątek
	// lub
	Debugger::log($e, Debugger::ERROR); wysyła również powiadomienie e-mail
}

Jeśli chcesz, aby Tracy rejestrował błędy PHP jako E_NOTICE lub E_WARNING ze szczegółowymi informacjami (raport HTML), ustaw Debugger::$logSeverity:

Debugger::$logSeverity = E_NOTICE | E_WARNING;

Dla prawdziwego zawodowca dziennik błędów jest kluczowym źródłem informacji i chce on być natychmiast informowany o każdym nowym błędzie. Ladenka jest w tym względzie bardzo pomocna, gdyż może go informować o nowych wpisach w dzienniku za pomocą poczty elektronicznej. Określamy gdzie mają być wysyłane maile za pomocą zmiennej $email:

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

Jeśli używasz całego Nette Framework, to to i więcej można ustawić w pliku konfiguracyjnym.

Jednak aby nie zalać skrzynki mailowej, zawsze wysyła tylko jedną wiadomość i tworzy plik email-sent. Po otrzymaniu powiadomienia mailowego, deweloper sprawdza log, naprawia aplikację i usuwa plik monitorujący, tym samym ponownie aktywując wysyłanie maili.

Otwieranie w edytorze

Po wyświetleniu strony błędu możesz kliknąć na nazwy plików i otworzą się one w Twoim edytorze z kursorem w odpowiedniej linii. Możesz również tworzyć pliki (akcja create file) lub poprawiać w nich błędy (akcja fix it). Aby to zadziałało, wystarczy skonfigurować przeglądarkę i system.

Obsługiwane wersje PHP

Tracy kompatybilny z 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

Ważne dla najnowszych wersji poprawek.

Porty

Jest to lista nieoficjalnych portów dla innych frameworków i CMS-ów: