Tutoriales

Content Security Policy

Si tu sitio web utiliza Content Security Policy, necesitarás añadir el mismo 'nonce-<value>' y 'strict-dynamic' a script-src para que Tracy funcione correctamente. Algunos complementos de terceros pueden requerir configuraciones adicionales. Nonce no es soportado en la directiva style-src, si utilizas esta directiva, debes añadir 'unsafe-inline', pero deberías evitarlo en modo de producción.

Ejemplo de configuración para Nette Framework:

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

Ejemplo en PHP puro:

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

Carga más rápida

La ejecución es directa, sin embargo, si tienes scripts bloqueantes de carga lenta en tu página web, pueden ralentizar la carga de Tracy. La solución es colocar <?php Tracy\Debugger::renderLoader() ?> en tu plantilla antes de todos los scripts:

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

Depuración de peticiones AJAX

Tracy captura automáticamente las peticiones AJAX creadas mediante jQuery o la API nativa fetch. Las peticiones se muestran en la barra de Tracy como líneas adicionales, lo que permite una depuración fácil y cómoda de AJAX.

Si no quieres capturar las peticiones AJAX automáticamente, puedes deshabilitar esta función configurando la variable de JavaScript:

window.TracyAutoRefresh = false;

Para monitorizar manualmente peticiones AJAX específicas, añade la cabecera HTTP X-Tracy-Ajax con el valor que devuelve Tracy.getAjaxHeader(). Aquí hay un ejemplo de uso con la función fetch:

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

Este enfoque permite la depuración selectiva de peticiones AJAX.

Almacenamiento de datos

Tracy puede mostrar paneles en la Tracy bar y Bluescreens para peticiones AJAX y redirecciones. Tracy crea su propia sesión, almacena los datos en sus propios archivos temporales y utiliza la cookie tracy-session.

Tracy también se puede configurar para usar la sesión nativa de PHP, que iniciamos antes de activar Tracy:

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

En caso de que el inicio de la sesión requiera una inicialización más compleja, puedes ejecutar Tracy inmediatamente (para que pueda procesar cualquier error que surja) y luego inicializar el manejador de la sesión y finalmente informar a Tracy que la sesión está lista para usar mediante la función dispatch():

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

// sigue la inicialización de la sesión
// y el inicio de la sesión
session_start();

Debugger::dispatch();

La función setSessionStorage() existe desde la versión 2.9, antes Tracy usaba siempre la sesión nativa de PHP.

Scrubber personalizado

Scrubber es un filtro que previene la fuga de datos sensibles durante el volcado, como contraseñas o credenciales de acceso. El filtro se llama para cada elemento del array u objeto volcado y devuelve true si el valor es sensible. En tal caso, se imprime ***** en lugar del valor.

// impide la impresión de valores de claves y propiedades como `password`,
// `password_repeat`, `check_password`, `DATABASE_PASSWORD`, etc.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// lo usamos para todos los dumps dentro de BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;

Logger personalizado

Podemos crear nuestro propio logger que registrará errores, excepciones no capturadas y también será invocado por el método Tracy\Debugger::log(). El logger implementa la interfaz Tracy\ILogger.

use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// envía una petición a Slack
	}
}

Y posteriormente lo activamos:

Tracy\Debugger::setLogger(new SlackLogger);

Si usamos el Nette Framework completo, puedes configurarlo en el archivo de configuración NEON:

services:
	tracy.logger: SlackLogger

Integración de monolog

El paquete Tracy proporciona un adaptador PSR-3 que permite la integración 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'); // escribe: [<TIMESTAMP>] main-channel.INFO: info [] []
Debugger::log('warning', Debugger::WARNING); // escribe: [<TIMESTAMP>] main-channel.WARNING: warning [] []

nginx

Si Tracy no funciona en el servidor nginx, probablemente esté mal configurado. Si hay algo como esto en la configuración:

try_files $uri $uri/ /index.php;

cámbialo a:

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