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;