Руководства

Content Security Policy

Если ваш сайт использует Content Security Policy, вам нужно будет добавить те же 'nonce-<value>' и 'strict-dynamic' в script-src, чтобы Tracy работала правильно. Некоторые сторонние дополнения могут требовать дополнительных настроек. Nonce не поддерживается в директиве style-src, если вы используете эту директиву, вы должны добавить 'unsafe-inline', но в production-режиме этого следует избегать.

Пример конфигурации для 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 Bar и Bluescreen для 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-сессию.

Собственный scrubber

Scrubber – это фильтр, который предотвращает утечку конфиденциальных данных при дампинге, таких как пароли или учетные данные. Фильтр вызывается для каждого элемента дампируемого массива или объекта и возвращает 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

Интеграция Monolog

Пакет 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'); // writes: [<TIMESTAMP>] main-channel.INFO: info [] []
Debugger::log('warning', Debugger::WARNING); // writes: [<TIMESTAMP>] main-channel.WARNING: warning [] []

nginx

Если у вас не работает Tracy на сервере nginx, скорее всего, он неправильно настроен. Если в конфигурации есть что-то вроде:

try_files $uri $uri/ /index.php;

измените это на:

try_files $uri $uri/ /index.php$is_args$args;