Rețete
Politica de securitate a conținutului
Dacă site-ul dvs. utilizează Content Security Policy, va trebui să adăugați 'nonce-<value>'
și
'strict-dynamic'
la script-src
pentru ca Tracy să funcționeze corect. Este posibil ca unele pluginuri
terțe să necesite directive suplimentare. Nonce nu este acceptat în directiva style-src
, dacă utilizați această
directivă trebuie să adăugați 'unsafe-inline'
, dar acest lucru ar trebui evitat î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ă
Integrarea de bază este simplă, însă dacă aveți scripturi lente de blocare în pagina web, acestea pot încetini
încărcarea Tracy. Soluția este să plasați <?php Tracy\Debugger::renderLoader() ?>
în șablonul dvs.
înainte de orice script:
<!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 captează automat solicitările AJAX efectuate cu ajutorul jQuery sau al API-ului nativ fetch
. Aceste cereri
sunt afișate ca rânduri suplimentare în bara Tracy, permițând o depanare AJAX ușoară și convenabilă.
Dacă nu doriți să capturați automat solicitările AJAX, puteți dezactiva această funcție prin setarea variabilei JavaScript:
window.TracyAutoRefresh = false;
Pentru monitorizarea manuală a unor cereri AJAX specifice, adăugați antetul HTTP X-Tracy-Ajax
cu valoarea
returnată de Tracy.getAjaxHeader()
. Iată un exemplu de utilizare a acestuia 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 de bare Tracy și Bluescreens pentru cereri AJAX și redirecționări. Tracy își creează
propriile sesiuni, stochează datele în propriile fișiere temporare și utilizează un cookie tracy-session
.
Tracy poate fi configurat, de asemenea, să utilizeze o sesiune PHP nativă, care este inițiată înainte ca Tracy să fie pornit:
session_start();
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();
În cazul în care pornirea unei sesiuni necesită o inițializare mai complexă, puteți porni Tracy imediat (pentru ca
acesta să poată gestiona orice erori care apar) și apoi să inițializați gestionarul de sesiune și, în final, să îl
informați pe Tracy că sesiunea este pregătită pentru a fi utilizată utilizând funcția dispatch()
:
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();
// urmată de inițializarea sesiunii
// și începe sesiunea
session_start();
Debugger::dispatch();
Funcția setSessionStorage()
există de la versiunea 2.9, înainte de aceasta Tracy folosea întotdeauna sesiunea
nativă PHP.
Scrubber personalizat
Scrubber este un filtru care previne scurgerea datelor sensibile, cum ar fi parolele sau acreditările. Filtrul este apelat
pentru fiecare element din matricea sau obiectul descărcat și returnează true
dacă valoarea este sensibilă. În
acest caz, în locul valorii se tipărește *****
.
// evită descărcarea valorilor cheilor și a 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 descărcările din BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;
Logger personalizat
Putem crea un logger personalizat pentru a înregistra erori, excepții neacoperite și, de asemenea, pentru a fi apelat de
Tracy\Debugger::log()
. Logger implementează interfața Tracy\ILogger.
use Tracy\ILogger;
class SlackLogger implements ILogger
{
public function log($value, $priority = ILogger::INFO)
{
// trimite o cerere către Slack
}
}
Și apoi îl activăm:
Tracy\Debugger::setLogger(new SlackLogger);
Dacă folosim Nette Framework complet, îl putem seta în fișierul de configurare NEON:
services:
tracy.logger: SlackLogger
Monolog Integration
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'); // scrie: [<TIMESTAMP>] main-channel.INFO: info [] [] []
Debugger::log('warning', Debugger::WARNING); // scrie: [<TIMESTAMP>] main-channel.WARNING: warning [] [] []
nginx
Dacă Tracy nu funcționează pe nginx, probabil că este configurat greșit. Dacă există ceva de genul
try_files $uri $uri/ /index.php;
schimbați-l cu
try_files $uri $uri/ /index.php$is_args$args;