Οδηγοί
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;