Rezepte

Sicherheitsrichtlinien für Inhalte

Wenn Ihre Website die Content Security Policy verwendet, müssen Sie Folgendes hinzufügen 'nonce-<value>' und 'strict-dynamic' zu script-src hinzufügen, damit Tracy richtig funktioniert. Einige Plugins von Drittanbietern können zusätzliche Direktiven erfordern. Nonce wird in der Direktive style-src nicht unterstützt. Wenn Sie diese Direktive verwenden, müssen Sie 'unsafe-inline' hinzufügen, aber dies sollte im Produktionsmodus vermieden werden.

Konfigurationsbeispiel für Nette Framework:

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

Beispiel in reinem PHP:

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

Schnelleres Laden

Die grundlegende Integration ist einfach, aber wenn Sie langsame blockierende Skripte in der Webseite haben, können diese das Laden des Tracy verlangsamen. Die Lösung ist, dass Sie <?php Tracy\Debugger::renderLoader() ?> in Ihre Vorlage vor den Skripten einzufügen:

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

Fehlersuche bei AJAX-Anfragen

Tracy erfasst automatisch AJAX-Anfragen, die mit jQuery oder der systemeigenen API fetch gestellt werden. Diese Anfragen werden als zusätzliche Zeilen in der Tracy-Leiste angezeigt, was ein einfaches und bequemes AJAX-Debugging ermöglicht.

Wenn Sie nicht möchten, dass AJAX-Anfragen automatisch erfasst werden, können Sie diese Funktion durch Setzen der JavaScript-Variable deaktivieren:

window.TracyAutoRefresh = false;

Für die manuelle Überwachung bestimmter AJAX-Anfragen fügen Sie den HTTP-Header X-Tracy-Ajax mit dem von Tracy.getAjaxHeader() zurückgegebenen Wert hinzu. Hier ist ein Beispiel für die Verwendung mit der Funktion fetch:

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

Dieser Ansatz ermöglicht ein selektives Debugging von AJAX-Anfragen.

Datenspeicherung

Tracy kann Tracy-Leisten und Bluescreens für AJAX-Anfragen und Weiterleitungen anzeigen. Tracy erstellt seine eigenen Sitzungen, speichert Daten in seinen eigenen temporären Dateien und verwendet ein tracy-session Cookie.

Tracy kann auch so konfiguriert werden, dass es eine native PHP-Sitzung verwendet, die gestartet wird, bevor Tracy eingeschaltet wird:

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

Falls das Starten einer Sitzung eine komplexere Initialisierung erfordert, können Sie Tracy sofort starten (so dass es mit auftretenden Fehlern umgehen kann), dann den Sitzungshandler initialisieren und schließlich Tracy über die Funktion dispatch() mitteilen, dass die Sitzung zur Verwendung bereit ist:

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

// gefolgt von der Sitzungsinitialisierung
// und starten Sie die Sitzung
session_start();

Debugger::dispatch();

Die Funktion setSessionStorage() gibt es seit Version 2.9, davor hat Tracy immer die native PHP-Sitzung verwendet.

Benutzerdefinierter Scrubber

Scrubber ist ein Filter, der verhindert, dass sensible Daten wie Passwörter oder Anmeldedaten aus Dumps durchsickern. Der Filter wird für jedes Element des gedumpten Arrays oder Objekts aufgerufen und gibt true zurück, wenn der Wert sensibel ist. In diesem Fall wird ***** anstelle des Wertes ausgegeben.

// vermeidet das Dumping von Schlüsselwerten und Eigenschaften wie `Passwort`,
// Passwort_Wiederholung", "Passwort_Prüfung", "Datenbank-Passwort", usw.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// wir verwenden es für alle Dumps innerhalb von BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;

Benutzerdefinierter Logger

Wir können einen benutzerdefinierten Logger erstellen, der Fehler und nicht abgefangene Ausnahmen protokolliert und auch von Tracy\Debugger::log() aufgerufen werden kann. Logger implementiert die Schnittstelle Tracy\ILogger.

use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// sendet eine Anfrage an Slack
	}
}

Und dann aktivieren wir ihn:

Tracy\Debugger::setLogger(new SlackLogger);

Wenn wir das vollständige Nette Framework verwenden, können wir es in der NEON-Konfigurationsdatei einstellen:

services:
	tracy.logger: SlackLogger

Monolog-Integration

Das Tracy-Paket bietet einen PSR-3-Adapter, der die Integration von monolog/monolog ermöglicht.

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

nginx

Wenn Tracy unter nginx nicht funktioniert, ist es wahrscheinlich falsch konfiguriert. Wenn es etwas gibt wie

try_files $uri $uri/ /index.php;

ändern Sie es in

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