Przepisy

Polityka bezpieczeństwa treści

Jeśli Twoja witryna korzysta z Content Security Policy, będziesz musiał dodać 'nonce-<value>' i 'strict-dynamic' do script-src, aby Tracy działała poprawnie. Niektóre wtyczki 3rd mogą wymagać dodatkowych dyrektyw. Nonce nie jest obsługiwany w dyrektywie style-src, jeśli używasz tej dyrektywy, musisz dodać 'unsafe-inline', ale należy tego unikać w trybie produkcyjnym.

Przykład konfiguracji dla Nette Framework:

http:
	csp:
		script-src: [nonce, strict-dynamic]

Przykład w czystym PHP:

$nonce = base64_encode(random_bytes(20));
header("Content-Security-Policy: script-src 'nonce-$nonce' 'strict-dynamic';");

Szybsze ładowanie

Podstawowa integracja jest prosta, jednak jeśli posiadasz wolno blokujące się skrypty na stronie, mogą one spowolnić ładowanie Tracy. Rozwiązaniem jest umieszczenie <?php Tracy\Debugger::renderLoader() ?> w swoim szablonie przed jakimikolwiek skryptami:

<!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>

Debugowanie żądań AJAX

Tracy automatycznie przechwytuje żądania AJAX wykonane przy użyciu jQuery lub natywnego interfejsu API fetch. Żądania te są wyświetlane jako dodatkowe wiersze na pasku Tracy, umożliwiając łatwe i wygodne debugowanie AJAX.

Jeśli nie chcesz automatycznie przechwytywać żądań AJAX, możesz wyłączyć tę funkcję, ustawiając zmienną JavaScript:

window.TracyAutoRefresh = false;

W celu ręcznego monitorowania określonych żądań AJAX, dodaj nagłówek HTTP X-Tracy-Ajax z wartością zwracaną przez Tracy.getAjaxHeader(). Oto przykład użycia go z funkcją fetch:

fetch(url, {
    headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'X-Tracy-Ajax': Tracy.getAjaxHeader(),
    }
})

Takie podejście pozwala na selektywne debugowanie żądań AJAX.

Przechowywanie danych

Tracy może wyświetlać panele paska Tracy i ekrany Bluescreens dla żądań AJAX i przekierowań. Tracy tworzy własne sesje, przechowuje dane we własnych plikach tymczasowych i używa pliku cookie tracy-session.

Tracy może być również skonfigurowany do korzystania z natywnej sesji PHP, która jest uruchamiana przed włączeniem Tracy:

session_start();
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();

W przypadku, gdy uruchomienie sesji wymaga bardziej złożonej inicjalizacji, można od razu uruchomić Tracy (aby mogła obsłużyć wszelkie pojawiające się błędy), a następnie zainicjować obsługę sesji i ostatecznie poinformować Tracy, że sesja jest gotowa do użycia za pomocą funkcji dispatch():

Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();

// po czym następuje inicjalizacja sesji
// i rozpocząć sesję
session_start();

Debugger::dispatch();

Funkcja setSessionStorage() istnieje od wersji 2.9, wcześniej Tracy zawsze używała natywnej sesji PHP.

Custom Scrubber

Scrubber jest filtrem, który zapobiega wyciekowi wrażliwych danych z zrzutów, takich jak hasła lub poświadczenia. Filtr ten jest wywoływany dla każdego elementu zrzucanej tablicy lub obiektu i zwraca true, jeśli wartość jest wrażliwa. W takim przypadku zamiast wartości wypisywana jest *****.

// pozwala uniknąć dumpingu wartości kluczy i właściwości takich jak `password`,
// `password_repeat`, `check_password`, `DATABASE_PASSWORD`, itp.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// używamy go do wszystkich zrzutów wewnątrz BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;

Logger niestandardowy

Możemy stworzyć własny logger, który będzie rejestrował błędy, niezałatwione wyjątki, a także będzie wywoływany przez Tracy\Debugger::log(). Logger implementuje interfejs Tracy\ILogger.

use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// wysyła zapytanie do Slacka
	}
}

A następnie aktywujemy go:

Tracy\Debugger::setLogger(new SlackLogger);

Jeśli korzystamy z pełnego Nette Framework, możemy go ustawić w pliku konfiguracyjnym NEON:

services:
	tracy.logger: SlackLogger

Monolog Integration

Pakiet Tracy dostarcza adapter PSR-3, pozwalający na integrację monologu/monologu.

$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'); // pisze: [<TIMESTAMP>] main-channel.INFO: info [] []
Debugger::log('warning', Debugger::WARNING); // pisze: [<TIMESTAMP>] main-channel.WARNING: warning [] []

nginx

Jeśli Tracy nie działa na nginx, prawdopodobnie jest źle skonfigurowany. Jeśli jest coś takiego jak

try_files $uri $uri/ /index.php;

zmień to na

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