Ξεκινώντας με την Tracy

Η βιβλιοθήκη Tracy είναι ένας χρήσιμος καθημερινός βοηθός για τον προγραμματιστή PHP. Θα σας βοηθήσει να:

  • εντοπίσετε και να διορθώσετε γρήγορα σφάλματα
  • καταγράψετε σφάλματα
  • εκτυπώσετε μεταβλητές
  • μετρήσετε τον χρόνο εκτέλεσης σεναρίων και ερωτημάτων βάσης δεδομένων
  • παρακολουθήσετε τις απαιτήσεις μνήμης

Η PHP είναι μια γλώσσα ιδανική για τη δημιουργία δύσκολα εντοπίσιμων σφαλμάτων, καθώς δίνει στους προγραμματιστές σημαντική ελευθερία. Γι' αυτό, το εργαλείο εντοπισμού σφαλμάτων Tracy είναι ακόμα πιο πολύτιμο. Μεταξύ των διαγνωστικών εργαλείων για PHP, αντιπροσωπεύει την απόλυτη κορυφή.

Αν συναντάτε την Tracy για πρώτη φορά σήμερα, πιστέψτε ότι η ζωή σας θα αρχίσει να χωρίζεται σε αυτήν πριν την Tracy και σε αυτήν με αυτήν. Καλώς ήρθατε στο καλύτερο μέρος!

Εγκατάσταση

Ο καλύτερος τρόπος για να εγκαταστήσετε την Tracy είναι να κατεβάσετε το τελευταίο πακέτο, ή να χρησιμοποιήσετε τον Composer:

composer require tracy/tracy

Μπορείτε επίσης να κατεβάσετε ολόκληρο το πακέτο ως αρχείο tracy.phar.

Χρήση

Ενεργοποιούμε την Tracy καλώντας τη μέθοδο Tracy\Debugger::enable() το συντομότερο δυνατό στην αρχή του προγράμματος, πριν από την αποστολή οποιασδήποτε εξόδου:

use Tracy\Debugger;

require 'vendor/autoload.php'; // případně tracy.phar - εναλλακτικά tracy.phar

Debugger::enable();

Το πρώτο πράγμα που θα παρατηρήσετε στη σελίδα είναι το Tracy Bar στην κάτω δεξιά γωνία. Αν δεν το βλέπετε, μπορεί να σημαίνει ότι η Tracy τρέχει σε λειτουργία παραγωγής. Η Tracy, για λόγους ασφαλείας, είναι ορατή μόνο στο localhost. Για να δοκιμάσετε αν λειτουργεί, μπορείτε να την αλλάξετε προσωρινά σε λειτουργία ανάπτυξης χρησιμοποιώντας την παράμετρο Debugger::enable(Debugger::Development).

Tracy Bar

Το Tracy Bar είναι ένα πλωτό πάνελ που εμφανίζεται στην κάτω δεξιά γωνία της σελίδας. Μπορούμε να το μετακινήσουμε με το ποντίκι και μετά την επαναφόρτωση της σελίδας θα θυμάται τη θέση του.

Στο Tracy Bar μπορούν να προστεθούν και άλλα χρήσιμα πάνελ. Πολλά από αυτά θα τα βρείτε στα πρόσθετα, ή μπορείτε ακόμη και να γράψετε τα δικά σας.

Αν δεν θέλετε να εμφανίζεται το Tracy Bar, ορίστε:

Debugger::$showBar = false;

Οπτικοποίηση σφαλμάτων και εξαιρέσεων

Σίγουρα γνωρίζετε καλά πώς η PHP ανακοινώνει τα σφάλματα: εκτυπώνει κάτι τέτοιο στον πηγαίο κώδικα της σελίδας:

Parse error:  syntax error, unexpected '}' in HomePresenter.php on line 15

ή σε περίπτωση μη παγιδευμένης εξαίρεσης:

Fatal error:  Uncaught Nette\MemberAccessException: Call to undefined method Nette\Application\UI\Form::addTest()? in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php:100
Stack trace:
#0 /sandbox/vendor/nette/utils/src/Utils/Object.php(75): Nette\Utils\ObjectMixin::call(Object(Nette\Application\UI\Form), 'addTest', Array)
#1 /sandbox/app/Forms/SignFormFactory.php(32): Nette\Object->__call('addTest', Array)
#2 /sandbox/app/Presentation/Sign/SignPresenter.php(21): App\Forms\SignFormFactory->create()
#3 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(181): App\Presentation\Sign\SignPresenter->createComponentSignInForm('signInForm')
#4 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(139): Nette\ComponentModel\Container->createComponent('signInForm')
#5 /sandbox/temp/cache/latte/15206b353f351f6bfca2c36cc.php(17): Nette\ComponentModel\Co in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php on line 100

Η κατανόηση μιας τέτοιας εξόδου δεν είναι ακριβώς εύκολη. Αν ενεργοποιήσουμε την Tracy, το σφάλμα ή η εξαίρεση εμφανίζεται σε εντελώς διαφορετική μορφή:

Το μήνυμα σφάλματος κυριολεκτικά φωνάζει. Βλέπουμε ένα μέρος του πηγαίου κώδικα με την επισημασμένη γραμμή όπου προέκυψε το σφάλμα και η πληροφορία Call to undefined method Nette\Http\User::isLogedIn() εξηγεί κατανοητά τι είδους σφάλμα είναι. Επιπλέον, ολόκληρη η σελίδα είναι ζωντανή, μπορούμε να κάνουμε κλικ για περισσότερες λεπτομέρειες. Δοκιμάστε το.

Και ξέρετε τι; Με αυτόν τον τρόπο παγιδεύει και εμφανίζει ακόμη και τα μοιραία σφάλματα. Χωρίς την ανάγκη εγκατάστασης οποιασδήποτε επέκτασης.

Σφάλματα όπως ένα τυπογραφικό λάθος στο όνομα μιας μεταβλητής ή η προσπάθεια ανοίγματος ενός μη υπάρχοντος αρχείου δημιουργούν αναφορές επιπέδου E_NOTICE ή E_WARNING. Αυτά μπορούν εύκολα να παραβλεφθούν στα γραφικά της σελίδας, μπορεί ακόμη και να μην είναι καθόλου ορατά (εκτός αν κοιτάξετε τον κώδικα της σελίδας).

Ή μπορούν να εμφανιστούν όπως και τα σφάλματα:

Debugger::$strictMode = true; // zobraz všechny chyby - εμφάνιση όλων των σφαλμάτων
Debugger::$strictMode = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED; // všechny chyby kromě deprecate oznámení - όλα τα σφάλματα εκτός από τις ειδοποιήσεις απόσυρσης

Σημείωση: Η Tracy μετά την ενεργοποίηση αλλάζει το επίπεδο αναφοράς σφαλμάτων σε E_ALL. Αν θέλετε να αλλάξετε αυτήν την τιμή, κάντε το μετά την κλήση της enable().

Λειτουργία ανάπτυξης έναντι παραγωγής

Όπως βλέπετε, η Tracy είναι αρκετά φλύαρη, κάτι που μπορεί να εκτιμηθεί στο περιβάλλον ανάπτυξης, ενώ στον διακομιστή παραγωγής θα προκαλούσε πραγματική καταστροφή. Εκεί, καμία πληροφορία εντοπισμού σφαλμάτων δεν πρέπει να εκτυπωθεί. Γι' αυτό η Tracy διαθέτει αυτόματη ανίχνευση περιβάλλοντος και αν εκτελέσουμε το παράδειγμα σε έναν ζωντανό διακομιστή, το σφάλμα αντί να εμφανιστεί, θα καταγραφεί και ο επισκέπτης θα δει μόνο ένα κατανοητό μήνυμα χρήστη:

Η λειτουργία παραγωγής καταστέλλει την εμφάνιση όλων των πληροφοριών εντοπισμού σφαλμάτων που στέλνουμε προς τα έξω με το dump(), και φυσικά επίσης όλων των μηνυμάτων σφάλματος που δημιουργεί η PHP. Έτσι, αν ξεχάσατε κάποιο dump($obj) στον κώδικα, δεν χρειάζεται να ανησυχείτε, τίποτα δεν θα εκτυπωθεί στον διακομιστή παραγωγής.

Πώς λειτουργεί η αυτόματη ανίχνευση λειτουργίας; Η λειτουργία είναι ανάπτυξης όταν η εφαρμογή εκτελείται στο localhost (δηλ. διεύθυνση IP 127.0.0.1 ή ::1) και δεν υπάρχει διακομιστής μεσολάβησης (δηλ. η HTTP κεφαλίδα του). Αλλιώς, τρέχει σε λειτουργία παραγωγής.

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

Debugger::enable('23.75.345.200'); // lze uvést i pole IP adres - μπορείτε επίσης να καθορίσετε έναν πίνακα διευθύνσεων IP

Σίγουρα συνιστούμε να συνδυάσετε τη διεύθυνση IP με ένα cookie. Στο cookie tracy-debug αποθηκεύουμε ένα μυστικό διακριτικό, π.χ. secret1234, και με αυτόν τον τρόπο ενεργοποιούμε τη λειτουργία ανάπτυξης μόνο για προγραμματιστές που έχουν πρόσβαση από μια συγκεκριμένη διεύθυνση IP και έχουν το αναφερόμενο διακριτικό στο cookie:

Debugger::enable('secret1234@23.75.345.200');

Μπορούμε επίσης να ορίσουμε απευθείας τη λειτουργία ανάπτυξης/παραγωγής χρησιμοποιώντας τη σταθερά Debugger::Development ή Debugger::Production ως παράμετρο της μεθόδου enable().

Αν χρησιμοποιείτε το Nette Framework, ρίξτε μια ματιά στο πώς να ρυθμίσετε τη λειτουργία για αυτό και αυτό θα χρησιμοποιηθεί στη συνέχεια και για την Tracy.

Καταγραφή σφαλμάτων

Σε λειτουργία παραγωγής, η Tracy καταγράφει αυτόματα όλα τα σφάλματα και τις παγιδευμένες εξαιρέσεις σε ένα αρχείο καταγραφής κειμένου. Για να μπορεί να πραγματοποιηθεί η καταγραφή, πρέπει να ορίσουμε την απόλυτη διαδρομή προς τον κατάλογο καταγραφής στη μεταβλητή $logDirectory ή να την περάσουμε ως δεύτερη παράμετρο της μεθόδου enable():

Debugger::$logDirectory = __DIR__ . '/log';

Η καταγραφή σφαλμάτων είναι ταυτόχρονα εξαιρετικά χρήσιμη. Φανταστείτε ότι όλοι οι χρήστες της εφαρμογής σας είναι στην πραγματικότητα beta testers, οι οποίοι δωρεάν κάνουν εξαιρετική δουλειά στην εύρεση σφαλμάτων και θα κάνατε μια ανοησία αν πετάγατε τις πολύτιμες αναφορές τους χωρίς προσοχή στον κάδο απορριμμάτων.

Αν χρειάζεται να καταγράψουμε ένα προσαρμοσμένο μήνυμα ή μια εξαίρεση που παγιδεύσατε, χρησιμοποιούμε για αυτό τη μέθοδο log():

Debugger::log('Doslo k necekane chybe'); // textová zpráva - μήνυμα κειμένου: Παρουσιάστηκε ένα απροσδόκητο σφάλμα

try {
	kritickaOperace(); // κρίσιμη λειτουργία
} catch (Exception $e) {
	Debugger::log($e); // logovat lze i výjimku - μπορείτε επίσης να καταγράψετε την εξαίρεση
	// nebo - ή
	Debugger::log($e, Debugger::ERROR); // odešle i e-mailovou notifikaci - αποστέλλει και ειδοποίηση μέσω e-mail
}

Αν θέλετε η Tracy να καταγράφει σφάλματα PHP όπως E_NOTICE ή E_WARNING με λεπτομερείς πληροφορίες (αναφορά HTML), ορίστε το Debugger::$logSeverity:

Debugger::$logSeverity = E_NOTICE | E_WARNING;

Για έναν πραγματικό επαγγελματία, το αρχείο καταγραφής σφαλμάτων είναι μια βασική πηγή πληροφοριών και θέλει να ενημερωθεί αμέσως για κάθε νέο σφάλμα. Η Tracy βοηθάει σε αυτό, καθώς μπορεί να ενημερώσει μέσω e-mail για μια νέα εγγραφή στο αρχείο καταγραφής. Καθορίζουμε πού να στέλνουμε τα e-mail με τη μεταβλητή $email:

Debugger::$email = 'admin@example.com';

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

Ωστόσο, για να μην πλημμυρίσει η θυρίδα ηλεκτρονικού ταχυδρομείου σας, στέλνει πάντα μόνο ένα μήνυμα και δημιουργεί το αρχείο email-sent. Ο προγραμματιστής, μετά τη λήψη της ειδοποίησης μέσω e-mail, ελέγχει το αρχείο καταγραφής, διορθώνει την εφαρμογή και διαγράφει το αρχείο παρακολούθησης, με αυτό ενεργοποιείται ξανά η αποστολή e-mail.

Άνοιγμα στον editor

Κατά την εμφάνιση της σελίδας σφάλματος, μπορείτε να κάνετε κλικ στα ονόματα των αρχείων και αυτά θα ανοίξουν στον editor σας με τον δρομέα στην αντίστοιχη γραμμή. Μπορείτε επίσης να δημιουργήσετε αρχεία (ενέργεια create file) ή να διορθώσετε σφάλματα σε αυτά (ενέργεια fix it). Για να λειτουργήσει αυτό, αρκεί να διαμορφώσετε τον περιηγητή και το σύστημα.

Υποστηριζόμενες εκδόσεις PHP

Tracy συμβατό με PHP
Tracy 2.10 – 3.0 PHP 8.0 – 8.4
Tracy 2.9 PHP 7.2 – 8.2
Tracy 2.8 PHP 7.2 – 8.1
Tracy 2.6 – 2.7 PHP 7.1 – 8.0
Tracy 2.5 PHP 5.4 – 7.4
Tracy 2.4 PHP 5.4 – 7.2

Ισχύει για την τελευταία έκδοση patch.

Ports

Αυτή είναι μια λίστα ανεπίσημων ports για άλλα frameworks και CMS: