Ghiduri

Content Security Policy

Dacă site-ul dvs. web utilizează Content Security Policy, va trebui să adăugați același 'nonce-<value>' și 'strict-dynamic' la script-src pentru ca Tracy să funcționeze corect. Unele suplimente de la terți pot necesita setări suplimentare. Nonce nu este suportat în directiva style-src, dacă utilizați această directivă, trebuie să adăugați 'unsafe-inline', dar ar trebui să evitați acest lucru în modul de producție.

Exemplu de configurare pentru Nette Framework:

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

Exemplu în PHP pur:

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

Încărcare mai rapidă

Pornirea este directă, însă dacă aveți pe pagina web scripturi blocante care se încarcă lent, acestea pot încetini încărcarea Tracy. Soluția este să plasați <?php Tracy\Debugger::renderLoader() ?> în șablonul dvs. înainte de toate scripturile:

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

Depanarea cererilor AJAX

Tracy capturează automat cererile AJAX create folosind jQuery sau API-ul nativ fetch. Cererile sunt afișate în bara Tracy ca rânduri suplimentare, ceea ce permite depanarea ușoară și convenabilă a AJAX-ului.

Dacă nu doriți să capturați automat cererile AJAX, puteți dezactiva această funcție setând variabila JavaScript:

window.TracyAutoRefresh = false;

Pentru monitorizarea manuală a cererilor AJAX specifice, adăugați antetul HTTP X-Tracy-Ajax cu valoarea returnată de Tracy.getAjaxHeader(). Iată un exemplu de utilizare cu funcția fetch:

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

Această abordare permite depanarea selectivă a cererilor AJAX.

Stocarea datelor

Tracy poate afișa panouri în bara Tracy și Bluescreen-uri pentru cererile AJAX și redirecționări. Tracy își creează propria sesiune, stochează datele în propriile fișiere temporare și utilizează cookie-ul tracy-session.

Tracy poate fi configurat și pentru a utiliza sesiunea PHP nativă, pe care o pornim înainte de a activa Tracy:

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

În cazul în care pornirea sesiunii necesită o inițializare mai complexă, puteți porni Tracy imediat (pentru a putea procesa eventualele erori apărute), apoi inițializați handlerul sesiunii și, în final, informați Tracy că sesiunea este gata de utilizare folosind funcția dispatch():

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

// urmează inițializarea sesiunii
// și pornirea sesiunii
session_start();

Debugger::dispatch();

Funcția setSessionStorage() există începând cu versiunea 2.9, înainte de aceasta Tracy utiliza întotdeauna sesiunea PHP nativă.

Scrubber personalizat

Scrubber este un filtru care previne scurgerea datelor sensibile la dumpare, cum ar fi parolele sau datele de acces. Filtrul este apelat pentru fiecare element al array-ului sau obiectului dumpat și returnează true dacă valoarea este sensibilă. În acest caz, în locul valorii se afișează *****.

// previne afișarea valorilor cheilor și proprietăților precum `password`,
// `password_repeat`, `check_password`, `DATABASE_PASSWORD`, etc.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// îl folosim pentru toate dump-urile din interiorul BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;

Logger personalizat

Putem crea propriul nostru logger, care va loga erorile, excepțiile necapturate și va fi, de asemenea, invocat de metoda Tracy\Debugger::log(). Loggerul implementează interfața Tracy\ILogger.

use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// trimite request către Slack
	}
}

Și apoi îl activăm:

Tracy\Debugger::setLogger(new SlackLogger);

Dacă folosim întregul Nette Framework, îl puteți seta în fișierul de configurare NEON:

services:
	tracy.logger: SlackLogger

Integrarea monologului

Pachetul Tracy oferă un adaptor PSR-3 care permite integrarea 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

Dacă Tracy nu funcționează pe serverul nginx, probabil că este configurat greșit. Dacă în configurație există ceva de genul:

try_files $uri $uri/ /index.php;

schimbați-l în:

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