Οδηγοί

Content Security Policy

Αν ο ιστότοπός σας χρησιμοποιεί Content Security Policy, θα πρέπει να προσθέσετε τα ίδια 'nonce-<value>' και 'strict-dynamic' στο script-src, ώστε η Tracy να λειτουργεί σωστά. Ορισμένα πρόσθετα τρίτων μπορεί να απαιτούν πρόσθετες ρυθμίσεις. Το Nonce δεν υποστηρίζεται στην οδηγία style-src, αν χρησιμοποιείτε αυτήν την οδηγία, πρέπει να προσθέσετε 'unsafe-inline', αλλά σε λειτουργία παραγωγής θα πρέπει να το αποφύγετε.

Παράδειγμα διαμόρφωσης για το Nette Framework:

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

Παράδειγμα σε καθαρό PHP:

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

Ταχύτερη φόρτωση

Η εκκίνηση είναι απλή, ωστόσο, αν έχετε στην ιστοσελίδα αργά φορτωνόμενα σενάρια που μπλοκάρουν, μπορούν να επιβραδύνουν τη φόρτωση της Tracy. Η λύση είναι να τοποθετήσετε το <?php Tracy\Debugger::renderLoader() ?> στο πρότυπό σας πριν από όλα τα σενάρια:

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

Εντοπισμός σφαλμάτων αιτημάτων AJAX

Η Tracy παγιδεύει αυτόματα τα αιτήματα AJAX που δημιουργήθηκαν με το jQuery ή το εγγενές API fetch. Τα αιτήματα εμφανίζονται στη γραμμή Tracy ως πρόσθετες γραμμές, το οποίο επιτρέπει εύκολο και άνετο εντοπισμό σφαλμάτων AJAX.

Αν δεν θέλετε να παγιδεύετε αυτόματα τα αιτήματα AJAX, μπορείτε να απενεργοποιήσετε αυτήν τη λειτουργία ρυθμίζοντας τη μεταβλητή JavaScript:

window.TracyAutoRefresh = false;

Για χειροκίνητη παρακολούθηση συγκεκριμένων αιτημάτων AJAX, προσθέστε την κεφαλίδα HTTP X-Tracy-Ajax με την τιμή που επιστρέφει το Tracy.getAjaxHeader(). Εδώ είναι ένα παράδειγμα χρήσης με τη συνάρτηση fetch:

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

Αυτή η προσέγγιση επιτρέπει επιλεκτικό εντοπισμό σφαλμάτων αιτημάτων AJAX.

Αποθήκευση δεδομένων

Η Tracy μπορεί να εμφανίσει πάνελ στο Tracy bar και Bluescreens για αιτήματα AJAX και ανακατευθύνσεις. Η Tracy δημιουργεί τη δική της συνεδρία, αποθηκεύει δεδομένα στα δικά της προσωρινά αρχεία και χρησιμοποιεί το cookie tracy-session.

Η Tracy μπορεί επίσης να διαμορφωθεί έτσι ώστε να χρησιμοποιεί την εγγενή συνεδρία PHP, την οποία ξεκινάμε πριν ενεργοποιήσουμε την Tracy:

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

Σε περίπτωση που η έναρξη της συνεδρίας απαιτεί πιο σύνθετη αρχικοποίηση, μπορείτε να εκκινήσετε την Tracy αμέσως (για να μπορεί να επεξεργαστεί τυχόν σφάλματα που προέκυψαν), στη συνέχεια να αρχικοποιήσετε τον χειριστή της συνεδρίας και τέλος να ενημερώσετε την Tracy ότι η συνεδρία είναι έτοιμη για χρήση χρησιμοποιώντας τη συνάρτηση dispatch():

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

// ακολουθεί η αρχικοποίηση της συνεδρίας
// και η έναρξη της συνεδρίας
session_start();

Debugger::dispatch();

Η συνάρτηση setSessionStorage() υπάρχει από την έκδοση 2.9, πριν, η Tracy χρησιμοποιούσε πάντα την εγγενή συνεδρία PHP.

Προσαρμοσμένος scrubber

Το Scrubber είναι ένα φίλτρο που αποτρέπει τη διαρροή ευαίσθητων δεδομένων κατά το dumping, όπως κωδικοί πρόσβασης ή διαπιστευτήρια. Το φίλτρο καλείται για κάθε στοιχείο του dump-αρισμένου πίνακα ή αντικειμένου και επιστρέφει true αν η τιμή είναι ευαίσθητη. Σε αυτήν την περίπτωση, αντί της τιμής, εκτυπώνεται *****.

// αποτρέπει την εκτύπωση τιμών κλειδιών και ιδιοτήτων όπως `password`,
// `password_repeat`, `check_password`, `DATABASE_PASSWORD`, κ.λπ.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// θα το χρησιμοποιήσουμε για όλα τα dumps μέσα στο BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;

Προσαρμοσμένος logger

Μπορούμε να δημιουργήσουμε τον δικό μας logger, ο οποίος θα καταγράφει σφάλματα, μη παγιδευμένες εξαιρέσεις και επίσης θα κληθεί από τη μέθοδο Tracy\Debugger::log(). Ο Logger υλοποιεί το interface Tracy\ILogger.

use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// στέλνει αίτημα στο Slack
	}
}

Και στη συνέχεια το ενεργοποιούμε:

Tracy\Debugger::setLogger(new SlackLogger);

Αν χρησιμοποιούμε το πλήρες Nette Framework, μπορείτε να το ρυθμίσετε στο αρχείο διαμόρφωσης NEON:

services:
	tracy.logger: SlackLogger

Ενσωμάτωση Monolog

Το πακέτο Tracy παρέχει έναν προσαρμογέα PSR-3 που επιτρέπει την ενσωμάτωση του 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'); // γράφει: [<TIMESTAMP>] main-channel.INFO: info [] []
Debugger::log('warning', Debugger::WARNING); // γράφει: [<TIMESTAMP>] main-channel.WARNING: warning [] []

nginx

Αν η Tracy δεν λειτουργεί στον διακομιστή nginx, πιθανότατα είναι λάθος διαμορφωμένος. Αν υπάρχει κάτι στη διαμόρφωση όπως:

try_files $uri $uri/ /index.php;

αλλάξτε το σε:

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