Skip to content
← Back to projects

Tracy Extensions

A few Flight specific extensions for Tracy Debugger to help debug your code quickly.

#Tracy Flight Panel Extensions

This is a set of extensions to make working with Flight a little richer.

  • Flight - Analyze all Flight variables.
  • Database - Analyze all queries that have run on the page (if you correctly initiate the database connection)
  • Request - Analyze all $_SERVER variables and examine all global payloads ($_GET, $_POST, $_FILES)
  • Session - Analyze all $_SESSION variables if sessions are active.
  • Twig - Analyze Twig template render time, memory, and which templates/blocks/macros ran (optional; requires twig/twig)

This is the Panel

Flight Bar

And each panel displays very helpful information about your application!

Flight Data Flight Database Flight Request

#Installation

Run composer require flightphp/tracy-extensions --dev and you're on your way!

#Configuration

There is very little configuration you need to do to get this started. You will need to initiate the Tracy debugger prior to using this https://tracy.nette.org/en/guide:

<?php

use Tracy\Debugger;
use flight\debug\tracy\TracyExtensionLoader;

// bootstrap code
require __DIR__ . '/vendor/autoload.php';

Debugger::enable();
// You may need to specify your environment with Debugger::enable(Debugger::DEVELOPMENT)

// if you use database connections in your app, there is a 
// required PDO wrapper to use ONLY IN DEVELOPMENT (not production please!)
// PdoQueryCapture extends Flight's SimplePdo (recommended) so you get all the
// helper methods (fetchAll, insert, update, etc) + automatic query capture for Tracy.
// It has a constructor compatible with PDO/SimplePdo.
$pdo = new PdoQueryCapture('sqlite:test.db', 'user', 'pass');
// or if you attach this to the Flight framework
Flight::register('db', PdoQueryCapture::class, ['sqlite:test.db', 'user', 'pass']);
// now whenever you make a query (via any method) it will capture the time, query, and parameters

// For full APM query tracking (beyond Tracy), install flightphp/apm and use:
// $db->logQueries() or enable via options; it fires the 'flight.db.queries' event.

// This connects the dots
if(Debugger::$showBar === true) {
	new TracyExtensionLoader(Flight::app());
}

// more code

Flight::start();

#Twig panel (optional)

If your app uses Twig, you can show template metrics on the Tracy bar. Create a Twig Profile, attach ProfilerExtension to your environment, then pass that profile into the loader. Attach profiling only in development.

<?php

use flight\debug\tracy\TracyExtensionLoader;
use flight\debug\tracy\TwigTracyExtension;
use Tracy\Debugger;
use Twig\Environment;
use Twig\Extension\ProfilerExtension;
use Twig\Loader\FilesystemLoader;
use Twig\Profiler\Profile;

$loader = new FilesystemLoader(__DIR__ . '/views');
$twig = new Environment($loader, [
	'debug' => true,
	'cache' => false,
]);

// Optional: expose Tracy dump helpers in templates ({{ dump(var) }}, {{ bdump(var) }}, {{ dumpe(var) }})
$twig->addExtension(new TwigTracyExtension());

$tracyConfig = [];
if (Debugger::$showBar === true) {
	$profile = new Profile();
	$twig->addExtension(new ProfilerExtension($profile));
	$tracyConfig['twig_profile'] = $profile;
}

if (Debugger::$showBar === true) {
	new TracyExtensionLoader(Flight::app(), $tracyConfig);
}

// Map Flight::render() to Twig (example)
Flight::map('render', function (string $template, array $data = []) use ($twig) {
	if (substr($template, -5) !== '.twig') {
		$template .= '.twig';
	}
	echo $twig->render($template, $data);
});

The panel lists total render time/memory, template/block/macro call counts, and each template that rendered with its own time and memory. The Twig tab is hidden when no templates were rendered for the request.

New version available.