01
Aoû
2004

Gestion des erreurs en PHP

1) Présentation des erreurs PHP

Afin de pouvoir différencier les différentes erreurs pouvant survenir à l'exécution d'un script, PHP dispose de neuf types d'erreurs qui seront présentés dans la première partie de ce chapitre. Le but de la seconde partie est de vous expliquer comment influer sur le comportement du parseur PHP si un problème survient.

1.1) Les différents niveaux d'erreurs

Chacun de ces neuf types d'erreur est une constante prédéfinie de PHP dont la valeur est un entier. En voilà la description :

E_NOTICE

Le type E_NOTICE correspond à une erreur non fatale causée quand quelque chose d'anormal survient pendant l'exécution d'un script telle une référence à une variable non définie qui peut indiquer un bug.

Cette erreur n'est par défaut pas rapportée car qu'elle peut être générée pendant l'exécution normale d'un script.

E_WARNING

Le type E_WARNING correspond également une erreur non fatale provoquée par des problèmes que le script aurait lui-même dû empêcher (exemple : passage de paramètres de types incorrects à une fonction). Bien que ces erreurs n'empêchent pas l'exécution du script, elles sont assez sérieuses pour être signalées par défaut à l'utilisateur et pour être prise en compte par le développeur.

E_ERROR

Le type E_ERROR est le premier type d'erreur considéré comme une erreur fatale et indique un problème que PHP n'a pas pu résoudre de lui-même. Les erreurs E_ERROR sont indiquées par défaut. En outre, ces erreurs doivent stopper l'exécution du script.

E_PARSE

Une erreur de type E_PARSE est produite par le parseur PHP et signifie généralement qu'une erreur de syntaxe a été rencontrée dans le code source.

Cette erreur est fatale et met fin à l'exécution du script.

E_CORE_ERROR

Le type E_CORE_ERROR est identique au type E_ERROR. Cependant, la source de l'erreur n'est pas le code source mais le noyau PHP.

En raison, des similitudes avec le type E_ERROR, il peut être intéressant de les gérer de manière identique.

E_CORE_WARNING

Comme pour E_CORE_ERROR, E_CORE_WARNING est le pendant de E_WARNING pour les warnings générés par le moteur PHP.

A traiter comme les erreurs de type E_WARNING.

E_COMPILE_ERROR

Les erreurs E_COMPILE_WARNING sont elles aussi générées par le Zend Engine. Elle peuvent être traitées comme les erreurs E_WARNING et E_CORE_WARNING.

E_ALL

E_ALL n'est pas vraiment un type d'erreur mais un regroupement de tous les types précédents. Sa valeur est la somme de toutes les constantes correspondant aux types ci-dessus.

1.2) Configuration du fichier php.ini

Il est possible d'influencer le comportement par défaut de PHP pour la gestion des erreurs dans le fichier php.ini.

Sous Microsoft Windows, vous le trouverez dans le répertoire de Windows (x:\windows pour Windows 9x/Me/XP, x:\winnt pour Windows NT4/2000/2003).

Si vous exécutez un système d'exploitation à base d'Unix (GNU/Linux, FreeBSD ...), tout dépend de la manière dont vous avez installé PHP (compilation à partir des sources, binaires).

Ce fichier pour Debian SID (la plateforme qui a servi à la rédaction de cet article) se trouve dans le répertoire /etc/php4/apache dans le cas d'une installation à partir des binaires.

Les options de configuration des erreurs débutent environ à la ligne 235 du fichier. C'est la section nommée Error handling and logging. Nous allons donc étudier une à une ces directives.

error_reporting

Cette première option permet de définir quelles vont être les erreurs qui seront affichées. Vous pouvez la renseigner en utilisant les types d'erreurs présentés ci-dessus et en utilisant les opérateurs bits à bits & (ET), | (OU), ~ (SAUF), de même que l'opérateur booléen ! (SAUF).

Exemple 1 :
par défaut PHP affiche toutes les erreurs sauf les E_NOTICE
Cela donne : E_ALL & ~E_NOTICE

Exemple 2 :
vous voulez n'afficher que les erreurs dites fatales
Cela se traduit par : E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR

display_errors

Cette option vous permet d'afficher ou non les erreurs à l'écran. Sa valeur peut être On (afficher) ou Off (ne pas afficher).

Conseil d'utilisation :
Pour le développement de votre site Web, mettez cette option à On.
Dans le cas d'un site en production, désactivez la.

log_errors

La valeur de cette option permet d'enregistrer les erreurs dans un fichier par le biais des commutateurs On et Off. Le nom du fichier est précisé plus bas dans le fichier par la directive error_log.

Conseil d'utilisation :
Dans le cas d'un site en production, activez cette option plutôt que d'afficher les erreurs.

log_errors_max_len

Cette directive permet de spécifier la longueur maximale d'un enregistrement d'erreurs. Sa valeur est à spécifier en octets. Pour ne pas restreindre la longueur, renseignez la avec la valeur 0.

ignore_repeated_errors

Renseignez cette option à On si vous ne souhaitez pas qu'une même erreur (même fichier source, même ligne) soit enregistrée. Pour désactiver cette option, la valeur est Off.

ignore_repeated_source

Cette option permet de décider si on doit éviter d'enregistrer les erreurs provenant du même fichier source.
Elle va de pair avec la précédente qui ne sera effective si et seulement si celle-ci est activée.

report_memleaks

Ce paramètre a pour objet d'indiquer ou pas les fuites de mémoire qui peuvent survenir au cours de l'exécution d'un script.
Pour être effectif, la valeur de l'option error_reporting doit être configuré pour afficher les erreurs de type E_WARNING.

track_errors

Si cette option a pour valeur On, l'intitulé du dernier message d'erreur sera stocké dans la variable .

html_errors

Cette option permet d'ajouter ou non du code HTML dans les messages d'erreurs. Pour cela, elle accepte les valeurs On et Off.

docref_root et docref_ext

Ces deux options ne sont valides que si html_errors est mise à On.
PHP peut générer des liens vers la documentation de la fonction qui a causé l'erreur. docref_root permet de définir l'emplacement de la documentation PHP et docref_ext permet d'indiquer l'extention des fichiers de documentation.

Exemple :
Supposons que vous ayez téléchargé la documentation sur le site officiel PHP et placé celle-ci dans le répertoire php_doc à la racine de votre serveur web
docref_root = '/php_doc/'
docref_ext = .html

error_prepend_string et error_append_string

Ces 2 paramètres donnent la possibilité d'ajouter une chaîne de caractère au début du message d'erreur (error_prepend_string) et à la fin (error_append_string).
Cette chaîne de caractères peut très bien être du code HTML.

Exemple :
vous voulez que l'erreur apparaisse en rouge et en gras avec la police Courier new
error_prepend_string = "<font color='red' face='Courier New'><b>"
error_append_string = "</b></font>";

error_log

Grâce à cette option, vous pouvez spécifier où vous souhaitez enregistré l'historique des erreurs survenues. Pour ça, deux possibilités :

  • indiquez soit le nom d'un fichier (exemple : /var/log/php/php_errors.log)
  • indiquez syslog pour que l'erreur soit enregistrée dans les logs système.

Nous voici arrivé à la fin de ce premier chapitre ... Passons maintenant à la gestion basique des erreurs en PHP à l'intérieur de vos scripts.

Posté par Renaud Castéran à 13:08 dans la catégorie Articles | RSS catégorie
Tag(s) associé(s) :
Partager cet article : Ajouter en favori sur KreuZZPoster cet article sur ScoopeoPoster cet article sur FuzzPoster cet article sur diggAjouter en favori sur Del.icio.usPoster cet article sur reddit
manumanu
03/08/04 12:44:41

Il manque juste un petit " }" à la ligne 23, après: "... case E_NOTICE : { $stopper = false; $type_erreur = "Notification"; break; ..."

;-) Bon article!

renaud
renaud
16/08/04 10:37:36

Oooppppsss comment ais-je pu commettre cette erreur ??? Désolé pour cette accolade manquante ...

corto
17/11/04 21:05:26

erreur aussi dans le premier case; la variable s'apelle $type et non pas $type_erreur

mifrog
21/03/05 10:20:44

bonjour. Comment se fait-il que le script de gestion des erreurs ne détecte jamais les erreurs de type E_PARSE? J'ai php 4.3.3. J'ai modifié les petites erreurs dans le script (paranthèse manquante, variable type), j'ai testé à mort ce script, et il ne détecte en fait que les erreurs de type E_USER_WARNING, E_USER_NOTICE, E_USER_ERROR...

OnRencontre
18/10/06 15:14:10

Enfin un article complet et bien expliqué à ce sujet... bravo !

pioc
09/07/07 16:36:50

Le script ne détecte pas les erreurs fatales. normal car elles interrompent le script et ne permettent donc pas la gestion d'erreur! Pour détecter les erreurs fatales, il faut utiliser le fichier de log de php

Les commentaires ne sont pas autorisés pour ce billet