Починаємо з Tracy

Бібліотека Tracy є корисним щоденним помічником для PHP-програміста. Вона допоможе вам:

  • швидко виявляти та виправляти помилки
  • логувати помилки
  • виводити змінні
  • вимірювати час виконання скриптів та запитів до бази даних
  • відстежувати використання пам'яті

PHP — це мова, яка ніби створена для створення важко виявлюваних помилок, оскільки надає розробникам значну свободу. Тим ціннішим є інструмент налагодження Tracy. Серед діагностичних інструментів для PHP він є абсолютним лідером.

Якщо ви сьогодні вперше знайомитеся з Tracy, повірте, ваше життя почне ділитися на те, що було до Tracy, і те, що з нею. Ласкаво просимо до кращої частини!

Встановлення

Найкращий спосіб встановити Tracy — це завантажити останній пакет або використати Composer:

composer require tracy/tracy

Ви також можете завантажити весь пакет як файл tracy.phar.

Використання

Tracy активується викликом методу Tracy\Debugger::enable() якомога раніше на початку програми, перед надсиланням будь-якого виводу:

use Tracy\Debugger;

require 'vendor/autoload.php'; // або tracy.phar

Debugger::enable();

Перше, що ви помітите на сторінці, — це Tracy Bar у правому нижньому куті. Якщо ви його не бачите, це може означати, що Tracy працює в робочому режимі. З міркувань безпеки Tracy видима лише на localhost. Щоб перевірити, чи вона працює, ви можете тимчасово перемкнути її в режим розробки за допомогою параметра Debugger::enable(Debugger::Development).

Tracy Bar

Tracy Bar — це плаваюча панель, яка з'являється в правому нижньому куті сторінки. Її можна переміщати мишею, і після перезавантаження сторінки вона запам'ятає свою позицію.

До Tracy Bar можна додавати інші корисні панелі. Багато з них можна знайти в доповненнях, або ви навіть можете написати власні.

Якщо ви не хочете відображати Tracy Bar, встановіть:

Debugger::$showBar = false;

Візуалізація помилок та винятків

Ви, напевно, добре знаєте, як PHP повідомляє про помилки: у вихідний код сторінки виводиться щось подібне:

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

або при неперехопленому винятку:

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

Зорієнтуватися в такому виводі не дуже легко. Якщо увімкнути Tracy, помилка або виняток відображатимуться зовсім в іншому вигляді:

Повідомлення про помилку буквально кричить. Ми бачимо частину вихідного коду з виділеним рядком, де сталася помилка, а інформація Call to undefined method Nette\Http\User::isLogedIn() зрозуміло пояснює, про яку помилку йдеться. Крім того, вся сторінка інтерактивна, ми можемо переходити до більш детальної інформації. Спробуйте.

І знаєте що? Таким чином вона перехоплює і відображає навіть фатальні помилки. Без необхідності встановлювати будь-які розширення.

Помилки, такі як одруківка в назві змінної або спроба відкрити неіснуючий файл, генерують повідомлення рівня E_NOTICE або E_WARNING. Їх легко пропустити в графіці сторінки, вони навіть можуть бути зовсім невидимими (хіба що при перегляді коду сторінки).

Або вони можуть відображатися так само, як помилки:

Debugger::$strictMode = true; // показати всі помилки
Debugger::$strictMode = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED; // всі помилки, крім повідомлень про застарілість

Примітка: Tracy після активації змінює рівень повідомлень про помилки на E_ALL. Якщо ви хочете змінити це значення, зробіть це після виклику enable().

Режим розробки vs робочий режим

Як бачите, Tracy досить багатослівна, що цінується в середовищі розробки, тоді як на робочому сервері це спричинило б справжню катастрофу. Там жодна інформація для налагодження не повинна виводитися. Тому Tracy має автоматичне визначення середовища, і якщо приклад запустити на реальному сервері, помилка замість відображення буде залогована, а відвідувач побачить лише зрозуміле для користувача повідомлення:

Робочий режим пригнічує відображення всієї інформації для налагодження, яку ми надсилаємо за допомогою dump(), і, звичайно, всіх повідомлень про помилки, які генерує PHP. Отже, якщо ви забули в коді якийсь dump($obj), не хвилюйтеся, на робочому сервері нічого не виведеться.

Як працює автоматичне визначення режиму? Режим є режимом розробки, якщо застосунок запущено на localhost (тобто IP-адреса 127.0.0.1 або ::1) і немає проксі (тобто його HTTP-заголовка). В іншому випадку він працює в робочому режимі.

Якщо ми хочемо увімкнути режим розробки і в інших випадках, наприклад, для програмістів, які підключаються з певної IP-адреси, ми вказуємо її як параметр методу enable():

Debugger::enable('23.75.345.200'); // можна також вказати масив IP-адрес

Настійно рекомендуємо поєднувати IP-адресу з cookie. У cookie tracy-debug ми зберігаємо секретний токен, наприклад, secret1234, і таким чином активуємо режим розробки лише для програмістів, які підключаються з певної IP-адреси та мають зазначений токен у cookie:

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

Режим розробки/робочий режим можна також встановити безпосередньо, використовуючи константу Debugger::Development або Debugger::Production як параметр методу enable().

Якщо ви використовуєте Nette Framework, подивіться, як налаштувати режим для нього, і він згодом буде використаний також для Tracy.

Логування помилок

У робочому режимі Tracy автоматично записує всі помилки та перехоплені винятки до текстового логу. Щоб логування могло відбуватися, ми повинні встановити абсолютний шлях до каталогу логів у змінну $logDirectory або передати його як другий параметр методу enable():

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

Логування помилок при цьому надзвичайно корисне. Уявіть, що всі користувачі вашого застосунку насправді є бета-тестерами, які безкоштовно виконують чудову роботу з пошуку помилок, і ви зробили б дурість, якби викинули їхні цінні звіти непоміченими у смітник.

Якщо нам потрібно залогувати власне повідомлення або перехоплений вами виняток, ми використовуємо для цього метод log():

Debugger::log('Doslo k necekane chybe'); // текстове повідомлення

try {
	kritickaOperace();
} catch (Exception $e) {
	Debugger::log($e); // можна логувати і виняток
	// або
	Debugger::log($e, Debugger::ERROR); // також надішле сповіщення електронною поштою
}

Якщо ви хочете, щоб Tracy логувала помилки PHP, такі як E_NOTICE або E_WARNING, з детальною інформацією (HTML-звіт), встановіть Debugger::$logSeverity:

Debugger::$logSeverity = E_NOTICE | E_WARNING;

Для справжнього професіонала лог помилок є ключовим джерелом інформації, і він хоче бути негайно поінформованим про кожну нову помилку. Tracy йде йому назустріч, оскільки вміє інформувати про новий запис у лозі електронною поштою. Куди надсилати листи, визначаємо змінною $email:

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

Якщо ви використовуєте весь Nette Framework, це та інші налаштування можна встановити в конфігураційному файлі.

Однак, щоб не заповнювати вашу поштову скриньку, вона завжди надсилає лише одне повідомлення і створює файл email-sent. Розробник після отримання сповіщення електронною поштою перевіряє лог, виправляє застосунок і видаляє файл моніторингу, чим знову активує надсилання електронних листів.

Відкриття в редакторі

При відображенні сторінки помилки можна натиснути на імена файлів, і вони відкриються у вашому редакторі з курсором на відповідному рядку. Також можна створювати файли (дія create file) або виправляти в них помилки (дія fix it). Щоб це працювало, достатньо налаштувати браузер та систему.

Підтримувані версії PHP

Tracy сумісний з 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

Застосовується до останньої версії патча.

Порти

Це список неофіційних портів для інших фреймворків та CMS: