Διαχείριση Σφαλμάτων στο PHP

In PHP, the default error handling is simple. A message is sent to the browser, which includes the filename, line number, and a description of the error.

Διαχείριση Σφαλμάτων στο PHP

Στη δημιουργία κώδικα και web εφαρμογών, η διαχείριση σφαλμάτων είναι μια σημαντική πτυχή. Αν ο κώδικας σας λείπει κώδικας αναγνώρισης σφαλμάτων, ο κώδικας σας φαίνεται λιγότερο επαγγελματικός και ανοίγει πόρτες για κινδύνους ασφαλείας.

Αυτό το教程 περιγράφει μερικές από τις πιο σημαντικές μεθόδους αναγνώρισης σφαλμάτων στο PHP.

Θα σας εξηγήσουμε διαφορετικές μεθόδους διαχείρισης σφαλμάτων:

  • Απλή κατάσταση "die()"
  • Προσαρμοσμένα σφάλματα και διαγνωστές
  • Αναφορά σφαλμάτων

Βασική διαχείριση σφαλμάτων: χρήση της συνάρτησης die()

Πρώτος παράδειγμα: απλός κώδικας ανοίγματος αρχείου κειμένου

<?php
$file=fopen("welcome.txt","r");
?>

Αν το αρχείο δεν υπάρχει, θα λάβετε ένα σφάλμα όπως αυτό:

Προειδοποίηση: fopen(welcome.txt) [λειτουργία fopen]: απέτυχε να ανοίξει ροή: 
Δεν υπάρχει αρχείο ή φάκελος στο C:\webfolder\test.php γραμμή 2

Για να αποφύγουμε την παροχή μηνυμάτων σφαλμάτων όπως τα παραπάνω, ελέγχουμε την ύπαρξη του αρχείου πριν την πρόσβαση σε αυτό:

<?php
if(!file_exists("welcome.txt"))
 {
 die("Αρχείο μη ευρετό");
 }
άλλως
 {
 $file=fopen("welcome.txt","r");
 }
?>

Τώρα, αν το αρχείο δεν υπάρχει, θα λάβετε ένα μήνυμα σφάλματος όπως αυτό:

Αρχείο μη ευρετό

Το παρακάτω κώδικας είναι πιο αποτελεσματικός από τον προηγούμενο, λόγω της απλής μηχανικής διαχείρισης σφαλμάτων που τερματίζει το σκοπό μετά το σφάλμα.

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

Δημιουργία προσαρμοσμένου διαχειριστή σφαλμάτων

Η δημιουργία ενός προσαρμοσμένου διαχειριστή σφαλμάτων είναι πολύ απλή. Διαθέτουμε απλώς μια ειδική συνάρτηση που μπορεί να καλείται όταν προκύπτει σφάλμα στο PHP.

Η συνάρτηση πρέπει να έχει την ικανότητα να χειρίζεται τουλάχιστον δύο παραμέτρους (επίπεδο σφάλματος και μήνυμα σφάλματος), αλλά μπορεί να αποδεχτεί μέχρι πέντε παραμέτρους (προαιρετικές: αρχείο, αριθμός γραμμής και περιεχόμενο σφάλματος):

Γλώσσα διαδικασίας

error_function(error_level, error_message,
error_file, error_line, error_context)
Παράμετροι Περιγραφή
error_level

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

Δείτε το παρακάτω πίνακα: επίπεδα αναφοράς σφαλμάτων.

error_message Απαιτείται. Προκαθορισμένα μηνύματα σφαλμάτων για χρήστες.
error_file Προαιρετικό. Ορίζει το όνομα του αρχείου όπου συνέβη το σφάλμα.
error_line Προαιρετικό. Ορίζει τον αριθμό της γραμμής όπου συνέβη το σφάλμα.
error_context Προαιρετικό. Ορίζει μια λίστα που περιλαμβάνει όλες τις μεταβλητές που χρησιμοποιούνται κατά τη διάρκεια της σφάλματος και τις τιμές τους.

Επίπεδα αναφοράς σφαλμάτων

Αυτά τα επίπεδα αναφοράς σφαλμάτων είναι διαφορετικοί τύποι σφαλμάτων που ο διαχειριστής σφαλμάτων σκοπεύει να χειριστεί:

Αξία Σταθερά Περιγραφή
2 E_WARNING Μη θανατηφόρα σφάλματα εκτέλεσης. Δεν σταματά την εκτέλεση του σκευασίου.
8 E_NOTICE

Ειδοποιήσεις εκτέλεσης.

Το σκεύασιο ανακαλύπτει ότι μπορεί να συμβεί σφάλμα, αλλά μπορεί να συμβεί και κατά τη διάρκεια της κανονικής εκτέλεσης του σκευασίου.

256 E_USER_ERROR Θανάτηφόρα σφάλματα χρήστη. Ξ彷ηλιζεται η E_ERROR που ο προγραμματιστής ορίζει με τη χρήση της συνάρτησης trigger_error() του PHP.
512 E_USER_WARNING Μη θανατηφόρα προειδοποιήσεις χρήστη. Ξ彷ηλιζεται η E_WARNING που ο προγραμματιστής ορίζει με τη χρήση της συνάρτησης trigger_error() του PHP.
1024 E_USER_NOTICE Αναφορές χρήστη. Ξ彷ηλιζεται η E_NOTICE που ο προγραμματιστής ορίζει με τη χρήση της συνάρτησης trigger_error() του PHP.
4096 E_RECOVERABLE_ERROR Κατάλληλα για συλλογή θανατηφόρα σφάλματα. Ξ彷ηλιζεται το E_ERROR, αλλά μπορεί να συλλεχθεί από τον προσαρμοσμένο διαχειριστή σφαλμάτων του χρήστη. (Δείτε set_error_handler())
8191 E_ALL

Όλα τα σφάλματα και οι προειδοποιήσεις, εκτός από το επίπεδο E_STRICT.

(Στο PHP 6.0, το E_STRICT είναι μέρος του E_ALL)

Τώρα, ας δημιουργήσουμε μια συνάρτηση για τη διαχείριση σφαλμάτων:

function customError($errno, $errstr)
 { 
 echo "<b>Sφάλμα:</b> [$errno] $errstr<br />";
 echo "Τέλος Σκрипτού";
 die();
 }

Το παραπάνω κώδικας είναι μια απλή συνάρτηση διαχείρισης σφαλμάτων. Όταν εκτελείται, αποκτά το επίπεδο σφάλματος και το μήνυμα σφάλματος. Στη συνέχεια, εκτυπώνει το επίπεδο σφάλματος και το μήνυμα και σταματά το σκεύασιο.

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

Set Error Handler

Ο προεπιλεγμένος διαχειριστής σφαλμάτων του PHP είναι ο ενσωματωμένος διαχειριστής σφαλμάτων. Θέλουμε να μετατρέψουμε τη συνάρτηση παραπάνω σε τον προεπιλεγμένο διαχειριστή σφαλμάτων κατά τη διάρκεια της εκτέλεσης του σκευασίου.

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

set_error_handler("customError");

Γιατί εμείς θέλουμε οι προσαρμοσμένες μας συναρτήσεις να χειρίζονται όλες τις σφάλματα, η set_error_handler() χρειάζεται μόνο έναν παράγοντα, μπορεί να προσθέσει δεύτερο παράγοντα για να καθορίσει το επίπεδο σφάλματος.

Παράδειγμα

Για να δοκιμάσουμε αυτόν τον διαχειριστή σφαλμάτων, να αναφέρουμε μια μη υπαρκτή μεταβλητή:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Sφάλμα:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

Η έξοδος του παρακάτω κώδικα πρέπει να είναι παρόμοια με αυτή:

Σφάλμα: [8] Ανεπιθύμητη μεταβλητή: test

Ενεργοποίηση Σφάλματος

Στο σημείο εισαγωγής δεδομένων χρήστη στο σενάριο, όταν το δεδομένο του χρήστη είναι μη έγκυρο, η ενεργοποίηση σφαλμάτων είναι πολύ χρήσιμη. Στο PHP, αυτή τη δουλειά την εκτελεί η συνάρτηση trigger_error().

Παράδειγμα

Σε αυτό το παράδειγμα, αν η μεταβλητή "test" είναι μεγαλύτερη από το "1", θα προκύψει σφάλμα:

<?php
$test=2;
if ($test>1)
{
trigger_error("Η τιμή πρέπει να είναι 1 ή κάτω από αυτήν");
}
?>

Η έξοδος του παρακάτω κώδικα πρέπει να είναι παρόμοια με αυτή:

Ειδοποίηση: Η τιμή πρέπει να είναι 1 ή κάτω από αυτήν
σε C:\webfolder\test.php στη γραμμή 6

Μπορείτε να ενεργοποιήσετε σφάλματα σε οποιοδήποτε σημείο του σκεπτού, μέσω του δεύτερου παραμέτρου μπορείτε να καθορίσετε το επίπεδο σφάλματος που ενεργοποιείτε.

Πιθανά τύποι σφαλμάτων:

  • E_USER_ERROR - Καταστροφικό σφάλμα runtime από χρήστη. Το σφάλμα δεν μπορεί να αποκατασταθεί. Το σενάριο διακοπεί.
  • E_USER_WARNING - Ανεπιβίωτο σφάλμα runtime από χρήστη. Το σενάριο δεν διακοπεί.
  • E_USER_NOTICE - Προεπιλεγμένο. Ειδοποιήσεις runtime από χρήστη. Το σενάριο εντοπίζει πιθανά σφάλματα, αλλά μπορεί να συμβεί και όταν το σενάριο εκτελείται κανονικά.

Παράδειγμα

Σε αυτό το παράδειγμα, αν η μεταβλητή "test" είναι μεγαλύτερη από το "1", θα προκύψει το σφάλμα E_USER_WARNING. Αν προκύψει το E_USER_WARNING, θα χρησιμοποιήσουμε τον προσαρμοσμένο διαχειριστή σφαλμάτων μας και θα τελειώσουμε το σενάριο:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Sφάλμα:</b> [$errno] $errstr<br />";
 echo "Τέλος Σκрипτού";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Η τιμή πρέπει να είναι 1 ή κάτω από αυτή",E_USER_WARNING);
 }
?>

Η έξοδος του παρακάτω κώδικα πρέπει να είναι παρόμοια με αυτή:

Σφάλμα: [512] Η τιμή πρέπει να είναι 1 ή κάτω από αυτή
Τέλος Σκрипτού

Τώρα, έχουμε μάθει πώς να δημιουργήσουμε το δικό μας error και πώς να τα ενεργοποιήσουμε, ας μελετήσουμε τώρα την καταγραφή σφαλμάτων.

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

Προεπιλεγμένα, ανάλογα με τη ρύθμιση του error_log στο php.ini, το PHP στέλνει καταγραφές σφαλμάτων στο σύστημα καταγραφής σφαλμάτων του διακομιστή ή σε αρχείο. Με τη χρήση της συνάρτησης error_log(), μπορείτε να στείλετε καταγραφές σφαλμάτων σε συγκεκριμένα αρχεία ή απομακρυσμένα προορισμούς.

Η αποστολή ενός μηνύματος σφάλματος στον εαυτό σας μέσω e-mail είναι μια καλή μέθοδος για να αποκτήσετε ειδοποιήσεις για συγκεκριμένα σφάλματα.

Με το E-Mail να στείλετε μήνυμα σφάλματος

Στο παρακάτω παράδειγμα, αν συμβεί συγκεκριμένο σφάλμα, θα στείλουμε e-mail με το μήνυμα σφάλματος και θα τελειώσουμε το σενάριο:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Sφάλμα:</b> [$errno] $errstr<br />";
 echo "Ο διαχειριστής ιστοσελίδας έχει ενημερωθεί";
 error_log("Σφάλμα: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Η τιμή πρέπει να είναι 1 ή κάτω από αυτή",E_USER_WARNING);
 }
?>

Η έξοδος του παρακάτω κώδικα πρέπει να είναι παρόμοια με αυτή:

Σφάλμα: [512] Η τιμή πρέπει να είναι 1 ή κάτω από αυτή
Ο διαχειριστής ιστοσελίδας έχει ενημερωθεί

Το e-mail που λαμβάνεται από τον παρακάτω κώδικα είναι παρόμοιο με αυτό:

Σφάλμα: [512] Η τιμή πρέπει να είναι 1 ή κάτω από αυτή

Αυτή η μέθοδος δεν είναι κατάλληλη για όλες τις σφάλματα. Τα συνηθισμένα σφάλματα πρέπει να καταγράφονται στο διακομιστή χρησιμοποιώντας το προεπιλεγμένο σύστημα καταγραφής σφαλμάτων του PHP.