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;