Erreur PHP
En PHP, la gestion des erreurs par défaut est simple. Un message d'erreur est envoyé au navigateur avec le nom du fichier, le numéro de ligne et un message décrivant l'erreur.
Gestion des erreurs PHP
La gestion des erreurs est un élément important lors de la création de scripts et d'applications Web. Si votre code manque de codage de détection d’erreurs, le programme n’aura pas l’air professionnel et ouvrira la porte à des risques de sécurité.
Ce tutoriel couvre certaines des méthodes de détection d'erreurs les plus importantes en PHP.
Nous vous expliquerons différentes méthodes de gestion des erreurs :
Instruction simple "die()"
Depuis Définir les erreurs et déclencheurs d'erreurs
Rapport d'erreurs
Gestion des erreurs de base : utilisez la fonction die()
Le premier exemple montre un script simple qui ouvre un fichier texte :
<?php $file=fopen("welcome.txt","r"); ?>Si le fichier n'existe pas, vous obtiendrez une erreur comme celle-ci :
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in /www/php/test/test.php on line 2À éviter les utilisateurs recevant des messages d'erreur comme celui ci-dessus, nous vérifions si le fichier existe avant d'y accéder :
<?php if(!file_exists("welcome.txt")) { die("文件不存在"); } else { $file=fopen("welcome.txt","r"); } ?>Maintenant, si le fichier n'existe pas, vous obtiendrez un message d'erreur comme celui-ci :
Par rapport au code précédent, le code ci-dessus est plus efficace car il utilise un mécanisme de gestion d'erreur simple. Le script a été terminé. après l'erreur.
Cependant, simplement mettre fin au script n'est pas toujours approprié. Examinons les fonctions PHP alternatives pour gérer les erreurs.
Création d'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 lorsqu'une erreur survient en PHP.
La 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 (facultatif : fichier, numéro de ligne et contexte d'erreur) :
Grammaire
error_function(error_level,error_message, error_file,error_line,error_context)
参数 | 描述 |
---|---|
error_level | 必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。 |
error_message | 必需。为用户定义的错误规定错误消息。 |
error_file | 可选。规定错误发生的文件名。 |
error_line | 可选。规定错误发生的行号。 |
error_context | 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。 |
Niveaux de rapport d'erreurs
Ces niveaux de rapport d'erreurs sont différents types d'erreurs gérées par des gestionnaires d'erreurs définis par l'utilisateur :
值 | 常量 | 描述 |
---|---|---|
2 | E_WARNING | 非致命的 run-time 错误。不暂停脚本执行。 |
8 | E_NOTICE | run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler()) |
8191 | E_ALL | 所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分) |
Maintenant, créons une fonction qui gère les erreurs :
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "脚本结束"; die(); }Le code ci-dessus est une simple fonction de gestion des erreurs. Lorsqu'il est déclenché, il obtient le niveau d'erreur et le message d'erreur. Il imprime ensuite le niveau d'erreur et le message, puis termine le script.
Maintenant que nous avons créé une fonction de gestion des erreurs, nous devons déterminer quand déclencher la fonction.
Définir le gestionnaire d'erreurs
Le gestionnaire d'erreurs par défaut de PHP est le gestionnaire d'erreurs intégré. Nous allons transformer la fonction ci-dessus en gestionnaire d'erreurs par défaut lorsque le script est en cours d'exécution.
Le gestionnaire d'erreurs peut être modifié pour s'appliquer uniquement à certaines erreurs, afin que le script puisse gérer différentes erreurs de différentes manières. Cependant, dans ce cas, nous avons l'intention d'utiliser notre gestionnaire d'erreurs personnalisé pour toutes les erreurs :
set_error_handler("customError");
Puisque nous voulons que notre fonction personnalisée gère toutes les erreurs, set_error_handler() ne nécessite qu'un seul argument, un deuxième paramètre peut être ajouté pour spécifier le niveau d'erreur.
Exemple
Testez ce gestionnaire d'erreurs en essayant de générer une variable qui n'existe pas :
<?php// 错误处理函数function customError($errno, $errstr){echo "<b>Error:</b> [$errno] $errstr";}// 设置错误处理函数set_error_handler("customError");// 触发错误echo($test);?> 以上代码的输出如下所示: Error: [8] Undefined variable: test
Déclencher une erreur
Au point du script où l'utilisateur saisit des données, il est utile de déclencher une erreur lorsque la saisie de l'utilisateur n'est pas valide. En PHP, cette tâche est accomplie par la fonction 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("变量值必须小于等于 1"); } ?>La sortie de ce qui précède le code est le suivant :
Notice: 变量值必须小于等于 1 in /www/test/php.php on line 5Vous pouvez déclencher des erreurs n'importe où dans le script En ajoutant le deuxième paramètre, vous pouvez spécifier le niveau d'erreur qui est déclenché.
Types d'erreurs possibles :
E_USER_ERROR - Erreur d'exécution fatale générée par l'utilisateur. L'erreur ne peut pas être récupérée. L'exécution du script a été interrompue.
E_USER_WARNING - Avertissement d'exécution non fatal généré par l'utilisateur. L'exécution du script n'est pas interrompue.
E_USER_NOTICE - Par défaut. Notifications d'exécution générées par l'utilisateur. Se produit lorsque le script détecte une erreur possible, mais peut également se produire lorsque le script s'exécute normalement.
Exemple
Dans cet exemple, si la variable "test" est supérieure à "1", l'erreur E_USER_WARNING se produit. Si E_USER_WARNING se produit, nous utiliserons notre gestionnaire d'erreurs personnalisé et terminerons le script :
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "脚本结束"; die(); } // 设置错误处理函数 set_error_handler("customError",E_USER_WARNING); // 触发错误 $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1",E_USER_WARNING); } ?>La sortie du code ci-dessus ressemblera à ceci :
Error: [512] 变量值必须小于等于 1 脚本结束Maintenant que nous avons appris comment créer nos propres erreurs et comment les déclencher, examinons la journalisation des erreurs.
Journalisation des erreurs
Par défaut, PHP envoie la journalisation des erreurs au système de journalisation ou au fichier du serveur selon la configuration error_log dans php.ini. En utilisant la fonction error_log(), vous pouvez envoyer un journal d'erreurs à un fichier spécifié ou à une destination distante.
Vous envoyer un message d'erreur par e-mail est un excellent moyen d'être averti d'une erreur spécifiée.
Envoyer un message d'erreur par e-mail
Dans l'exemple ci-dessous, si une erreur spécifique se produit, nous enverrons un e-mail avec un message d'erreur et terminerons le script :
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "已通知网站管理员"; error_log("Error: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } // 设置错误处理函数 set_error_handler("customError",E_USER_WARNING); // 触发错误 $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1",E_USER_WARNING); } ?>Le résultat du code ci-dessus ressemble à ceci :
Error: [512] 变量值必须小于等于 1已通知网站管理员 接收自以上代码的邮件如下所示: Error: [512] 变量值必须小于等于 1Cette méthode ne convient pas à toutes les erreurs. Les erreurs générales doivent être enregistrées sur le serveur à l'aide du système de journalisation PHP par défaut.