Gestion des erreurs PHP

Dans PHP, la gestion des erreurs par défaut est simple. Un message est envoyé au navigateur, ce message contient le nom de fichier, le numéro de ligne et un message de description de l'erreur.

Gestion des erreurs PHP

Lors de la création de scripts et d'applications web, la gestion des erreurs est une partie importante. Si votre code manque de code de détection des erreurs, le programme semble peu professionnel et ouvre des portes à des risques de sécurité.

Ce tutoriel présente certaines des méthodes de détection des erreurs les plus importantes en PHP.

Nous vous expliquerons différentes méthodes de gestion des erreurs :

  • Instruction simple "die()"
  • Erreurs personnalisées et déclencheurs d'erreur
  • Rapport d'erreur

Gestion de base des erreurs : utilisation de la fonction die()

Premier exemple d'un script simple pour ouvrir un fichier texte :

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

Si le fichier n'existe pas, vous obtiendrez un message d'erreur similaire à celui-ci :

Avertissement: fopen(welcome.txt) [fonction.fopen]: échec de l'ouverture du flux: 
Aucun fichier ou dossier trouvé dans C:\webfolder\test.php à la ligne 2

Pour éviter que l'utilisateur ne reçoive un message d'erreur similaire à celui ci-dessus, nous vérifions l'existence du fichier avant d'y accéder :

<?php
if(!file_exists("welcome.txt"))
 {
 die("Fichier introuvable");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

Maintenant, si le fichier n'existe pas, vous obtiendrez un message d'erreur similaire à celui-ci :

Fichier introuvable

Compared to the previous code, the code above is more efficient because it uses a simple error handling mechanism to terminate the script after the error.

Cependant, il n'est pas toujours approprié de simplement arrêter le script. Laissons-nous examiner les fonctions PHP alternatives pour gérer les erreurs.

Créer un gestionnaire d'erreurs personnalisé

Créer un gestionnaire d'erreurs personnalisé est très simple. Nous avons simplement créé une fonction dédiée qui peut être appelée lorsque des erreurs se produisent en PHP.

Cette fonction doit être capable de gérer au moins deux paramètres (niveau d'erreur et message d'erreur), mais peut accepter jusqu'à cinq paramètres (optionnels : fichier, numéro de ligne et contexte d'erreur) :

Syntaxe

error_function(error_level, error_message,
error_file, error_line, error_context)
Paramètres Description
error_level

Obligatoire. Définit le niveau de rapport d'erreur pour les erreurs définies par l'utilisateur. Doit être une valeur numérique.

Voir le tableau suivant : niveau de rapport d'erreur.

error_message Obligatoire. Définit les messages d'erreur pour les erreurs définies par l'utilisateur.
error_file Optionnel. Définir le nom du fichier où l'erreur s'est produite.
error_line Optionnel. Définir le numéro de ligne où l'erreur s'est produite.
error_context Optionnel. Définir un tableau contenant chaque variable utilisée lors de l'erreur et leurs valeurs.

Niveau de rapport d'erreur

Ces niveaux de rapport d'erreur sont différents types d'erreurs que le gestionnaire d'erreurs vise à traiter :

Valeur Constante Description
2 E_WARNING Erreurs non fatales au niveau d'exécution. Ne pas arrêter l'exécution du script.
8 E_NOTICE

Notifications au niveau d'exécution.

Le script découvre qu'une erreur pourrait se produire, mais cela pourrait également se produire pendant l'exécution normale du script.

256 E_USER_ERROR Erreurs générées par l'utilisateur fatales. Similaires aux E_ERROR définis par le programmeur en utilisant la fonction PHP trigger_error().
512 E_USER_WARNING Avertissements non fataux générés par l'utilisateur. Similaires aux E_WARNING définis par le programmeur en utilisant la fonction PHP trigger_error().
1024 E_USER_NOTICE Notifications générées par l'utilisateur. Similaires aux E_NOTICE définies par le programmeur en utilisant la fonction PHP trigger_error().
4096 E_RECOVERABLE_ERROR Erreurs fatales capturables. Similaires à E_ERROR, mais capturables par un gestionnaire d'erreurs personnalisé défini par l'utilisateur. (Voir set_error_handler()).
8191 E_ALL

Toutes les erreurs et les avertissements, sauf le niveau E_STRICT.

(Dans PHP 6.0, E_STRICT fait partie de E_ALL)

Maintenant, créons une fonction pour gérer les erreurs :

function customError($errno, $errstr)
 { 
 echo "<b>Erreur:</b> [$errno] $errstr<br />";
 echo "Fin du script";
 die();
 }

Le code ci-dessus est une fonction de gestion des erreurs simple. Lorsqu'elle est déclenchée, elle récupère le niveau d'erreur et le message d'erreur. Ensuite, elle affiche le niveau et le message d'erreur, et arrête l'exécution du script.

Maintenant que nous avons créé une fonction de gestion des erreurs, nous devons déterminer quand déclencher cette fonction.

Définir un gestionnaire d'erreurs

Le gestionnaire d'erreurs par défaut de PHP est le gestionnaire intégré. Nous avons l'intention de transformer la fonction ci-dessus en gestionnaire d'erreurs par défaut pendant l'exécution du script.

Il est possible de modifier le gestionnaire d'erreurs pour qu'il ne s'applique qu'à certaines erreurs, ce qui permet au script de traiter différemment chaque type d'erreur. Cependant, dans cet exemple, nous avons l'intention d'utiliser notre gestionnaire d'erreurs personnalisé pour toutes les erreurs :

set_error_handler("customError");

Comme nous souhaitons que notre fonction personnalisée traite toutes les erreurs, set_error_handler() nécessite uniquement un paramètre, mais un second peut être ajouté pour définir le niveau d'erreur.

Exemple

Pour tester ce gestionnaire d'erreurs, essayons de sortir une variable inexistante :

<?php
//fonction gestionnaire d'erreur
function customError($errno, $errstr)
 { 
 echo "<b>Erreur :</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

La sortie du code ci-dessus devrait être similaire à cela :

Erreur : [8] Variable non définie : test

Déclencher une erreur

À l'endroit où les utilisateurs saisissent des données dans le script, il est utile de déclencher des erreurs lorsque les données saisies par l'utilisateur sont invalides. En PHP, cette tâche est réalisée par trigger_error().

Exemple

Dans cet exemple, si la variable "test" est supérieure à "1", une erreur se produira :

<?php
$test=2;
if ($test>1)
{
trigger_error("La valeur doit être 1 ou inférieure");
}
?>

La sortie du code ci-dessus devrait être similaire à cela :

Avis : La valeur doit être 1 ou inférieure
in C:\webfolder\test.php on line 6

Vous pouvez déclencher une erreur à tout moment dans le script, en spécifiant le niveau de l'erreur via le second paramètre.

Types d'erreurs possibles :

  • E_USER_ERROR - erreur run-time fatale générée par l'utilisateur. L'erreur ne peut pas être récupérée. L'exécution du script est interrompue.
  • E_USER_WARNING - avertissement run-time non fatal généré par l'utilisateur. L'exécution du script n'est pas interrompue.
  • E_USER_NOTICE - par défaut. Notification run-time générée par l'utilisateur. Le script a détecté une éventuelle erreur, qui peut également se produire lorsque le script s'exécute normalement.

Exemple

Dans cet exemple, si la variable "test" est supérieure à "1", une erreur E_USER_WARNING se produit. Si une E_USER_WARNING se produit, nous utiliserons notre gestionnaire d'erreurs personnalisé et terminerons le script :

<?php
//fonction gestionnaire d'erreur
function customError($errno, $errstr)
 { 
 echo "<b>Erreur:</b> [$errno] $errstr<br />";
 echo "Fin du script";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("La valeur doit être 1 ou inférieure",E_USER_WARNING);
 }
?>

La sortie du code ci-dessus devrait être similaire à cela :

Erreur: [512] La valeur doit être 1 ou inférieure
Fin du script

Maintenant que nous avons appris à créer nos propres erreurs et à les déclencher, examinons maintenant la journalisation des erreurs.

Journalisation des erreurs

Par défaut, selon la configuration de error_log dans php.ini, PHP envoie des journaux d'erreur au système de journalisation des erreurs du serveur ou au fichier. En utilisant la fonction error_log(), vous pouvez envoyer des journaux d'erreur à un fichier ou à une destination distante spécifiée.

Envoyer un message d'erreur à vous-même par e-mail est une bonne méthode pour obtenir une notification d'erreur spécifique.

Envoyer un message d'erreur par E-Mail

Dans l'exemple suivant, si une erreur spécifique se produit, nous enverrons un e-mail avec le message d'erreur et terminerons le script :

<?php
//fonction gestionnaire d'erreur
function customError($errno, $errstr)
 { 
 echo "<b>Erreur:</b> [$errno] $errstr<br />";
 echo "Le webmaster a été informé";
 error_log("Erreur: [$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("La valeur doit être 1 ou inférieure",E_USER_WARNING);
 }
?>

La sortie du code ci-dessus devrait être similaire à cela :

Erreur: [512] La valeur doit être 1 ou inférieure
Le webmaster a été informé

Les e-mails reçus à partir du code ci-dessus sont similaires à cela :

Erreur: [512] La valeur doit être 1 ou inférieure

Cette méthode ne convient pas à tous les erreurs. Les erreurs courantes devraient être enregistrées sur le serveur en utilisant le système de journalisation PHP par défaut.