Συνταγές

Πολιτική ασφάλειας περιεχομένου

Εάν ο ιστότοπός σας χρησιμοποιεί Πολιτική ασφάλειας περιεχομένου, θα πρέπει να προσθέσετε 'nonce-<value>' και το 'strict-dynamic' στο script-src για να λειτουργήσει σωστά το Tracy. Ορισμένα πρόσθετα 3ου τύπου μπορεί να απαιτούν πρόσθετες οδηγίες. Το 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 είναι ένα φίλτρο που αποτρέπει τη διαρροή ευαίσθητων δεδομένων από απορρίψεις, όπως κωδικούς πρόσβασης ή διαπιστευτήρια. Το φίλτρο καλείται για κάθε στοιχείο του πίνακα ή του αντικειμένου που απορρίπτεται και επιστρέφει true εάν η τιμή είναι ευαίσθητη. Σε αυτή την περίπτωση, αντί της τιμής εκτυπώνεται το *****.

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

// το χρησιμοποιούμε για όλες τις απορρίψεις μέσα στο BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;

Προσαρμοσμένος καταγραφέας

Μπορούμε να δημιουργήσουμε έναν προσαρμοσμένο καταγραφέα για να καταγράφει σφάλματα, μη ληφθείσες εξαιρέσεις και επίσης να καλείται από το Tracy\Debugger::log(). Ο καταγραφέας υλοποιεί τη διεπαφή 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 Integration

Το πακέτο 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); // writes: [<TIMESTAMP>] main-channel.WARNING: warning [] []

nginx

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

try_files $uri $uri/ /index.php;

αλλάξτε το σε

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