Recettes

Politique de sécurité du contenu

Si votre site utilise la politique de sécurité du contenu, vous devrez ajouter 'nonce-<value>' et 'strict-dynamic' à script-src pour que Tracy fonctionne correctement. Certains plugins tiers peuvent nécessiter des directives supplémentaires. Le nonce n'est pas pris en charge par la directive style-src. Si vous utilisez cette directive, vous devez ajouter 'unsafe-inline', mais cela doit être évité en mode production.

Exemple de configuration pour Nette Framework:

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

Exemple en pur PHP :

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

Chargement plus rapide

L'intégration de base est simple, mais si vous avez des scripts qui bloquent lentement dans la page Web, ils peuvent ralentir le chargement de Tracy. La solution consiste à placer <?php Tracy\Debugger::renderLoader() ?> dans votre modèle avant tout 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>

Débogage des requêtes AJAX

Tracy capture automatiquement les requêtes AJAX effectuées à l'aide de jQuery ou de l'API native fetch. Ces requêtes sont affichées sous forme de lignes supplémentaires dans la barre de Tracy, ce qui permet un débogage AJAX facile et pratique.

Si vous ne souhaitez pas capturer automatiquement les requêtes AJAX, vous pouvez désactiver cette fonctionnalité en définissant la variable JavaScript :

window.TracyAutoRefresh = false;

Pour surveiller manuellement des requêtes AJAX spécifiques, ajoutez l'en-tête HTTP X-Tracy-Ajax avec la valeur renvoyée par Tracy.getAjaxHeader(). Voici un exemple d'utilisation avec la fonction fetch:

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

Cette approche permet un débogage sélectif des requêtes AJAX.

Stockage des données

Tracy peut afficher des panneaux de barre Tracy et des écrans bleus pour les requêtes AJAX et les redirections. Tracy crée ses propres sessions, stocke les données dans ses propres fichiers temporaires et utilise un cookie tracy-session.

Tracy peut également être configuré pour utiliser une session PHP native, qui est lancée avant que Tracy ne soit activé :

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

Dans le cas où le démarrage d'une session nécessite une initialisation plus complexe, vous pouvez démarrer Tracy immédiatement (afin qu'il puisse gérer les éventuelles erreurs qui se produisent), puis initialiser le gestionnaire de session et enfin informer Tracy que la session est prête à être utilisée en utilisant la fonction dispatch():

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

// suivi de l'initialisation de la session
// et démarrer la session
session_start();

Debugger::dispatch();

La fonction setSessionStorage() existe depuis la version 2.9, avant cela Tracy utilisait toujours la session PHP native.

Épurateur personnalisé

Scrubber est un filtre qui empêche les données sensibles de s'échapper des vidages, comme les mots de passe ou les informations d'identification. Le filtre est appelé pour chaque élément du tableau ou de l'objet vidés et renvoie true si la valeur est sensible. Dans ce cas, ***** est imprimé à la place de la valeur.

// évite de vider les valeurs des clés et les propriétés telles que `password`,
// `password_repeat`, `check_password`, `DATABASE_PASSWORD`, etc.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// Nous l'utilisons pour tous les dumps dans BlueScreen.
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;

Logger personnalisé

Nous pouvons créer un enregistreur personnalisé pour consigner les erreurs, les exceptions non corrigées et être également appelé par Tracy\Debugger::log(). Logger implémente l'interface Tracy\ILogger.

use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// envoie une demande à Slack
	}
}

Et ensuite nous l'activons :

Tracy\Debugger::setLogger(new SlackLogger);

Si nous utilisons le Nette Framework complet, nous pouvons le définir dans le fichier de configuration de NEON :

services:
	tracy.logger: SlackLogger

Intégration Monolog

Le paquet Tracy fournit un adaptateur PSR-3, permettant l'intégration de 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'); // écrit: [<TIMESTAMP>] canal principal.INFO: info [] []
Debugger::log('warning', Debugger::WARNING); // écrit: [<TIMESTAMP>] canal principal.WARNING: avertissement [] []

nginx

Si Tracy ne fonctionne pas sur nginx, il est probablement mal configuré. S'il y a quelque chose comme

try_files $uri $uri/ /index.php;

changez-le en

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