Identifier les Erreurs
Présentation
Lors du développement, il est inévitable de rencontrer des erreurs. En voici quelques exemples fréquents :
- accès à une variable non définie ;
- division par zéro lors d'une opération mathématique ;
- accès à un fichier ou une ressource inexistante ;
- absence du point virgule en fin d'instruction.
Les erreurs levées par le moteur de PHP se divisent en deux grandes catégories :
- celles qui n'interrompent pas l'exécution du script, mais peuvent altérer son fonctionnement ou produire des résultats inattendus ;
- celles qui interrompent immédiatement le script, nécessitant une correction avant de poursuivre.
L'exploitation du système d'erreur de PHP permet de localiser rapidement la source des problèmes dans le code et de comprendre les messages d'erreur, facilitant ainsi leur diagnostic et leur résolution.
Configuration de l'Affichage des Erreurs
Hiérarchie des configurations
Les paramètres de configuration de PHP peuvent être définis à plusieurs niveaux, chacun pouvant surcharger le précédent selon l'ordre suivant :
- Fichier de configuration globale (php.ini) : Le fichier php.ini contient la configuration globale pour le serveur PHP. C'est dans ce fichier que sont définis par défaut la plupart des paramètres qui régissent le comportement de PHP, tels que la gestion des erreurs, les limites de mémoire, ou les paramètres relatifs aux extensions. Ce fichier est généralement accessible uniquement aux administrateurs du serveur.
- Fichiers de configuration locaux : Certains serveurs permettent d'utiliser un fichier local (comme .user.ini) pour surcharger les paramètres globaux définis dans php.ini. Ces fichiers sont particulièrement utiles sur des environnements mutualisés et sont activés uniquement si la directive user_ini.filename est définie dans php.ini.
- Directives dans le code PHP : Les fonctions comme ini_set() permettent de modifier certains paramètres directement dans le code, mais uniquement pour la durée d'exécution du script. Notez que si la directive ini_set() est désactivée sur le serveur, vous ne pourrez pas utiliser cette méthode. Dans ce cas, il faudra passer par php.ini ou un fichier de configuration local, si disponible.
Configuration avec un fichier de configuration
Vous pouvez configurer PHP en utilisant le fichier de configuration global php.ini, qui définit le comportement général de PHP, ou, dans certains cas, avec des fichiers de configuration locaux tels que .user.ini, permettant de surcharger les paramètres globaux, notamment sur des environnements mutualisés.
Si vous ne connaissez pas le chemin du fichier php.ini utilisé par votre version actuelle de PHP, vous pouvez exécuter la commande suivante dans le terminal :
php --ini
Voici les paramètres principaux permettant de gérer les erreurs :
- error_reporting : Ce paramètre détermine le type d'erreurs que PHP doit signaler. Par exemple :
- Pour signaler toutes les erreurs, warnings, fatal errors, etc. :
error_reporting = E_ALL - Pour signaler toutes les erreurs, à l'exception de certains types spécifiques, vous pouvez utiliser le symbole ~ pour exclure ces types. Par exemple, pour activer tous les types d'erreurs sauf celles liées aux fonctionnalités obsolètes (deprecated), qui ne sont plus recommandées et risquent d'être supprimées dans une future version :
error_reporting = E_ALL & ~E_DEPRECATED - Pour signaler uniquement les erreurs critiques :
error_reporting = E_ERROR
- Pour signaler toutes les erreurs, warnings, fatal errors, etc. :
- display_errors : Ce paramètre détermine si les erreurs doivent être affichées directement sur la sortie standard (par exemple, dans le navigateur lors de l'exécution d'un script). Cela peut être utile en environnement de développement pour déboguer, mais il est fortement déconseillé de l'utiliser en production, car cela pourrait exposer des informations sensibles (comme des chemins de fichiers ou des configurations internes) :
- En développement : Activez l'affichage des erreurs :
display_errors = On - En production : Désactivez l'affichage pour éviter d'exposer des informations sensibles :
display_errors = Off
- En développement : Activez l'affichage des erreurs :
- display_startup_errors : Ce paramètre détermine si les erreurs survenant au démarrage de PHP (pendant l'initialisation du moteur ou le chargement des extensions) doivent être affichées :
- En développement : Activez l'affichage des erreurs de démarrage pour identifier les problèmes de configuration PHP :
display_startup_errors = On - En production : Désactivez l'affichage des erreurs de démarrage pour éviter d'exposer des informations sur le système :
display_startup_errors = Off
- En développement : Activez l'affichage des erreurs de démarrage pour identifier les problèmes de configuration PHP :
- log_errors : Ce paramètre permet d'enregistrer les erreurs dans un fichier de log, même si elles ne sont pas affichées :
- Pour activer l'enregistrement des erreurs dans le fichier log :
log_errors = On
- Pour activer l'enregistrement des erreurs dans le fichier log :
- error_log : Ce paramètre permet de préciser le chemin vers le fichier de log dans lequel les erreurs seront enregistrée si le paramètre log_errors est activé :
- Pour activer l'enregistrement des erreurs dans le fichier log :
error_log = "chemin/vers/le/fichier/php_errors.log"
- Pour activer l'enregistrement des erreurs dans le fichier log :
Voici une configuration typique pour le développement :
error_reporting = E_ALL
display_errors = On
log_errors = On
error_log = "chemin/vers/le/fichier/php_errors.log"
Configuration directement dans le code PHP
Dans certains environnements, notamment sur les services d'hébergement mutualisés, l'accès au fichier php.ini peut être restreint. Dans ce cas, vous pouvez configurer PHP directement dans votre code en définissant les directives nécessaires au début de vos scripts.
Voici une configuration typique pour le développement :
// Activer le signalement de toutes les erreurs.
error_reporting(E_ALL);
// Activer l'affichage des erreurs.
ini_set('display_errors', 1);
// Afficher les erreurs survenant au démarrage de PHP.
ini_set('display_startup_errors', 1);
// Activer la journalisation des erreurs.
ini_set('log_errors', '1');
// Définir le chemin absolu du fichier où seront enregistrées les erreurs.
ini_set('error_log', '/chemin/vers/le/fichier/php_errors.log');
Les Différents Types d'Erreurs
Dans la catégorie des erreurs levées par le moteur de PHP, il existe deux grands comportements distincts : certaines erreurs n'interrompent pas l'exécution du script, permettant au programme de continuer malgré leur présence, tandis que d'autres provoquent une interruption immédiate du script.
Les erreurs qui n'interrompent pas l'exécution du script
Ces erreurs signalent des problèmes mineurs ou potentiels sans empêcher le script de fonctionner. Elles sont particulièrement utiles en phase de développement pour identifier des points à améliorer ou des erreurs à corriger avant le déploiement en production.
Voici les types d'erreurs rencontrant se comportement :
- Notice : Signale des problèmes mineurs, tels que l'accès à une variable non définie. Il semblerait que ce type d'erreur tende à disparaître, étant progressivement remplacé par des warnings, qui offrent un signalement plus standardisé des problèmes.
- Warning : Indique des problèmes significatifs, tels que l'accès à une variable non définie ou une mauvaise utilisation de fonctions. Bien qu'elles n'interrompent pas l'exécution du script, ces erreurs peuvent entraîner un comportement imprévisible ou incorrect du programme.
- Deprecated : Avertit de l'utilisation de fonctionnalités obsolètes qui ne sont plus recommandées et risquent d'être supprimées dans de futures versions de PHP. Ces erreurs doivent être corrigées pour garantir la pérennité du code.
Les erreurs qui interrompent l'exécution du script
Ces erreurs signalent des problèmes critiques qui empêchent le script de continuer son exécution. Elles surviennent généralement lorsqu'une situation grave rend impossible le fonctionnement correct du programme, comme une fonction manquante ou une syntaxe incorrecte. Ces erreurs doivent être corrigées immédiatement, car elles bloquent le bon déroulement de l'application et peuvent entraîner une expérience utilisateur dégradée ou une indisponibilité du service.
Voici les types d'erreurs rencontrant ce comportement :
- ParseError : Erreur déclenchée lorsqu'il y a une erreur de syntaxe dans le code, comme des parenthèses manquantes ou une mauvaise utilisation des mots-clés.
- TypeError : Erreur signalant une incompatibilité de type, par exemple si une fonction attend un entier mais reçoit une chaîne.
- Error : Classe de base pour toutes les erreurs fatales non récupérables en PHP. Ces erreurs incluent des problèmes comme la tentative d'appeler une fonction sur un objet null ou une surcharge de mémoire.
- ArithmeticError : Erreur déclenchée lors de problèmes mathématiques spécifiques, comme des divisions par zéro dans des contextes interdits ou des calculs invalides avec des entiers ou des flottants.
- AssertionError : Cette erreur est déclenchée lors des tests de validité du code en phase de développement, permettant de détecter des anomalies ou incohérences.
Interpréter les Messages d'Erreur
Les messages d'erreur affichés par PHP fournissent des informations précieuses pour repérer la cause d'un dysfonctionnement et comprendre pourquoi le script ne s'exécute pas correctement. Voici les éléments clés d'un message d'erreur :
- Le type d'erreur : Indique la gravité du problème (Warning, TypeError, Error, etc.).
- Le fichier et la ligne : Précisent l'endroit exact dans le code où l'erreur s'est produite.
- La description : Explique la nature du problème (variable non définie, fonction introuvable, syntaxe incorrecte, etc.).
En examinant ces informations, vous pourrez rapidement cibler la portion de code à corriger et comprendre la nature de la solution à apporter (déclarer une variable, corriger une faute de syntaxe, respecter le type attendu d'une fonction, etc.).
Quelques exemples
- Dans l'exemple suivant, la variable $nom n'a pas été définie avant d'être utilisée. PHP indique qu'il s'agit d'une erreur non bloquante de type Warning et précise qu'elle se situe à la ligne 3 du fichier index.php.
- Contenu du fichier index.php :
<?php $prenom = "Claudy"; echo "Bonjour $prenom $nom"; - Résultat affiché :
Warning: Undefined variable $nom in /var/www/html/index.php on line 3 Bonjour Claudy - Pour résoudre cette erreur, il suffit de déclarer la variable avant son utilisation :
<?php $prenom = "Claudy"; $nom = "Focan"; echo "Bonjour $prenom $nom";
- Contenu du fichier index.php :
- En PHP, chaque instruction doit se terminer par un point-virgule pour indiquer clairement où elle s'arrête. Une autre erreur courante consiste en l'oubli de ce point-virgule ;. Dans l'exemple ci-dessous, l'absence de ce point-virgule se situe à la ligne 2, mais PHP signale l'erreur à la ligne 3, car le moteur ne détecte l'erreur qu'à la prochaine instruction, ici l'appel à echo.
- Contenu du fichier index.php :
<?php $prenom = "Claudy" echo "Bonjour $prenom"; - Résultat affiché :
Parse error: syntax error, unexpected token "echo" in /var/www/html/index.php on line 3 - Pour résoudre cette erreur, il suffit d'ajouter le point-virgule
; manquant en fin de la deuxième ligne d'instruction :
<?php $prenom = "Claudy"; echo "Bonjour $prenom";
- Contenu du fichier index.php :