Tutoriais
Content Security Policy
Se o seu site usa Content Security Policy, você precisará adicionar o mesmo 'nonce-<value>'
e
'strict-dynamic'
ao script-src
para que o Tracy funcione corretamente. Alguns add-ons de terceiros
podem exigir configurações adicionais. Nonce não é suportado na diretiva style-src
; se você usar esta diretiva,
deverá adicionar 'unsafe-inline'
, mas deve evitar isso no modo de produção.
Exemplo de configuração para o Nette Framework:
http:
csp:
script-src: [nonce, strict-dynamic]
Exemplo em PHP puro:
$nonce = base64_encode(random_bytes(20));
header("Content-Security-Policy: script-src 'nonce-$nonce' 'strict-dynamic';");
Carregamento mais rápido
A inicialização é direta, mas se você tiver scripts de bloqueio de carregamento lento em sua página da web, eles podem
retardar o carregamento do Tracy. A solução é colocar <?php Tracy\Debugger::renderLoader() ?>
em seu
template antes de todos os 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>
Depuração de requisições AJAX
O Tracy captura automaticamente requisições AJAX criadas usando jQuery ou a API nativa fetch
. As requisições
são exibidas na barra do Tracy como linhas adicionais, permitindo uma depuração AJAX fácil e conveniente.
Se você não quiser capturar requisições AJAX automaticamente, pode desativar este recurso definindo uma variável JavaScript:
window.TracyAutoRefresh = false;
Para monitorar manualmente requisições AJAX específicas, adicione o cabeçalho HTTP X-Tracy-Ajax
com o valor
retornado por Tracy.getAjaxHeader()
. Aqui está um exemplo de uso com a função fetch
:
fetch(url, {
headers: {
'X-Requested-With': 'XMLHttpRequest',
'X-Tracy-Ajax': Tracy.getAjaxHeader(),
}
})
Esta abordagem permite a depuração seletiva de requisições AJAX.
Armazenamento de dados
O Tracy pode exibir painéis na barra do Tracy e Bluescreens para requisições AJAX e redirecionamentos. O Tracy cria sua
própria sessão, armazena dados em seus próprios arquivos temporários e usa o cookie tracy-session
.
O Tracy também pode ser configurado para usar a sessão nativa do PHP, que iniciamos antes de ativar o Tracy:
session_start();
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();
Caso o início da sessão exija uma inicialização mais complexa, você pode iniciar o Tracy imediatamente (para que ele
possa processar quaisquer erros que ocorram), depois inicializar o manipulador de sessão e, finalmente, informar ao Tracy que a
sessão está pronta para uso usando a função dispatch()
:
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();
// segue a inicialização da sessão
// e o início da sessão
session_start();
Debugger::dispatch();
A função setSessionStorage()
existe desde a versão 2.9; antes disso, o Tracy sempre usava a sessão nativa
do PHP.
Scrubber personalizado
Scrubber é um filtro que impede o vazamento de dados sensíveis durante o dumping, como senhas ou credenciais de acesso.
O filtro é chamado para cada elemento do array ou objeto dumpado e retorna true
se o valor for sensível. Nesse
caso, *****
é exibido em vez do valor.
// impede a exibição de valores de chaves e propriedades 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;
};
// nós o usamos para todos os dumps dentro do BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;
Logger personalizado
Podemos criar nosso próprio logger que registrará erros, exceções não capturadas e também será invocado pelo método
Tracy\Debugger::log()
. O logger implementa a interface Tracy\ILogger.
use Tracy\ILogger;
class SlackLogger implements ILogger
{
public function log($value, $priority = ILogger::INFO)
{
// envia uma requisição para o Slack
}
}
E então o ativamos:
Tracy\Debugger::setLogger(new SlackLogger);
Se estivermos usando o Nette Framework completo, você pode defini-lo no arquivo de configuração NEON:
services:
tracy.logger: SlackLogger
Integração do Monolog
O pacote Tracy fornece um adaptador PSR-3 que permite a integração com 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'); // escreve: [<TIMESTAMP>] main-channel.INFO: info [] []
Debugger::log('warning', Debugger::WARNING); // escreve: [<TIMESTAMP>] main-channel.WARNING: warning [] []
nginx
Se o Tracy não estiver funcionando em um servidor nginx, provavelmente ele está mal configurado. Se houver algo como isto na configuração:
try_files $uri $uri/ /index.php;
altere para:
try_files $uri $uri/ /index.php$is_args$args;