Рецепти
Політика безпеки контенту
Якщо ваш сайт використовує політику безпеки вмісту, вам потрібно
додати 'nonce-<value>'
і 'strict-dynamic'
до script-src
, щоб Tracy
працював належним чином. Деякі сторонні плагіни можуть потребувати
додаткових директив. Nonce не підтримується в директиві style-src
,
якщо ви використовуєте цю директиву, вам потрібно додати
'unsafe-inline'
, але цього слід уникати у виробничому режимі.
Приклад конфігурації для Nette Framework:
http:
csp:
script-src: [nonce, strict-dynamic]
Приклад на чистому PHP:
$nonce = base64_encode(random_bytes(20));
header("Content-Security-Policy: script-src 'nonce-$nonce' 'strict-dynamic';");
Швидше завантаження
Базова інтеграція проста, однак, якщо на вашій веб-сторінці є
повільні блокувальні скрипти, вони можуть сповільнити завантаження
Tracy. Рішення полягає в тому, щоб розмістити
<?php Tracy\Debugger::renderLoader() ?>
у ваш шаблон перед будь-якими
скриптами:
<!DOCTYPE html>
<html>
<head>
<title>...<title>
<?php Tracy\Debugger::renderLoader() ?>
<link rel="stylesheet" href="assets/style.css">
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
Налагодження AJAX-запитів
Tracy автоматично перехоплює AJAX-запити, виконані за допомогою jQuery або
власного API fetch
. Ці запити відображаються у вигляді додаткових
рядків у панелі Tracy, що дозволяє легко і зручно налагоджувати AJAX.
Якщо ви не бажаєте автоматично перехоплювати AJAX-запити, ви можете вимкнути цю функцію, задавши змінну JavaScript:
window.TracyAutoRefresh = false;
Для ручного моніторингу конкретних AJAX-запитів додайте HTTP-заголовок
X-Tracy-Ajax
зі значенням, яке повертає функція Tracy.getAjaxHeader()
.
Ось приклад його використання з функцією fetch
:
fetch(url, {
headers: {
'X-Requested-With': 'XMLHttpRequest',
'X-Tracy-Ajax': Tracy.getAjaxHeader(),
}
})
Такий підхід дозволяє вибірково налагоджувати AJAX-запити.
Зберігання даних
Tracy може відображати панелі Tracy і сині екрани для AJAX-запитів і
перенаправлень. Tracy створює власні сесії, зберігає дані у власних
тимчасових файлах і використовує файли cookie tracy-session
.
Tracy також можна налаштувати на використання власного сеансу PHP, який запускається перед ввімкненням Tracy:
session_start();
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();
Якщо запуск сеансу вимагає складнішої ініціалізації, ви можете
запустити Tracy негайно (щоб він міг обробити будь-які помилки, що
виникають), а потім ініціалізувати обробник сеансу і, нарешті,
повідомити Tracy, що сеанс готовий до використання, за допомогою функції
dispatch()
:
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();
// з подальшою ініціалізацією сеансу
// і запустіть сесію
session_start();
Debugger::dispatch();
Функція setSessionStorage()
існує з версії 2.9, до цього Tracy завжди
використовував власний сеанс PHP.
Користувацький скрубер
Скрубер – це фільтр, який запобігає витоку конфіденційних даних з
дампа, таких як паролі або облікові дані. Фільтр викликається для
кожного елемента дампа масиву або об'єкта і повертає true
, якщо
значення є конфіденційним. У цьому випадку замість значення
виводиться *****
.
// уникає вивантаження значень і властивостей ключів, таких як `password`,
// `password_repeat`, `check_password`, `DATABASE_PASSWORD` тощо.
$scrubber = function(string $key, $value, ?string $class): bool
{
return preg_match('#password#i', $key) && $value !== null;
};
// ми використовуємо його для всіх дампів всередині BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;
Користувацький логгер
Ми можемо створити власний логгер для реєстрації помилок,
неперехоплених виключень, а також для виклику за адресою
Tracy\Debugger::log()
. Логгер реалізує інтерфейс Tracy\ILogger.
use Tracy\ILogger;
class SlackLogger implements ILogger
{
public function log($value, $priority = ILogger::INFO)
{
// надсилає запит до Slack
}
}
А потім ми його активуємо:
Tracy\Debugger::setLogger(new SlackLogger);
Якщо ми використовуємо повний Nette Framework, ми можемо встановити його у файлі конфігурації NEON:
services:
tracy.logger: SlackLogger
Інтеграція монологу
До складу пакета Tracy входить адаптер PSR-3, що дозволяє інтегрувати monolog/monolog.
$monolog = new Monolog\Logger('main-channel');
$monolog->pushHandler(new Monolog\Handler\StreamHandler($logFilePath, Monolog\Logger::DEBUG));
$tracyLogger = new Tracy\Bridges\Psr\PsrToTracyLoggerAdapter($monolog);
Debugger::setLogger($tracyLogger);
Debugger::enable();
Debugger::log('info'); // пише: [<TIMESTAMP>] main-channel.INFO: інформація [] [] []
Debugger::log('warning', Debugger::WARNING); // пише: [<TIMESTAMP>] main-channel.WARNING: warning [] []
nginx
Якщо Tracy не працює на nginx, ймовірно, він неправильно налаштований. Якщо є щось на кшталт
try_files $uri $uri/ /index.php;
змініть його на
try_files $uri $uri/ /index.php$is_args$args;