Gestion des erreurs 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

Lors de la création de scripts et d'applications Web, erreur la manipulation est une partie importante. 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 :

· Simple instruction "die()"

· Erreurs et erreurs personnalisées Déclencheurs

· 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
$open=fopen('error.txt','r');
echo $open;
?>

Si le fichier n'existe pas, vous obtiendrez une erreur comme celle-ci :

Avertissement : fopen(error.txt) [function.fopen] : échec d'ouverture du flux :
Aucun fichier ou répertoire de ce type dans /www/php/test/test.php en ligne 2

Afin d'éviter que les utilisateurs ne reçoivent des messages d'erreur similaires à celui ci-dessus, nous visitons Fichier avant de vérifier si le fichier existe :

<?php
header("Content-type:text/html;charset=utf-8");
if(!file_exists('error.txt')){
    die("文件不存在");
}else{
    $file=fopen('error.txt','r');
}
?>

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

Le fichier n'existe pas

Par rapport au code précédent, le code ci-dessus est plus efficace car il utilise un mécanisme simple de gestion des erreurs pour terminer le script après une erreur.

Cependant, simplement mettre fin au script n'est pas toujours approprié. Examinons 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 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) :

fonction_erreur (niveau_erreur, message_erreur, fichier_erreur, ligne_erreur, contexte_erreur)


      参数      描述


  error_level

必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。
  error_message必需。为用户定义的错误规定错误消息。

  error_file可选。规定错误发生的文件名。
  error_line可选。规定错误发生的行号。
  error_context可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。

Niveaux de rapport d'erreurs

Ces niveaux de rapport d'erreurs sont gérés par des gestionnaires d'erreurs définis par l'utilisateur. Différents types d'erreurs :

           常量    描述
    2E_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。
valeur<🎜><🎜>
<🎜>Constante<🎜>< 🎜> <🎜> Description<🎜><🎜>
2E_WARNINGExécution non fatale -erreur de temps. Ne suspendez pas l’exécution du script.
<🎜 >  <🎜><🎜> 8<🎜><🎜><🎜>
<🎜><🎜>E_NOTICE<🎜>
notification d'exécution. Se produit lorsque le script détecte une erreur possible, mais peut également se produire lorsque le script s'exécute normalement.
<🎜 > <🎜><🎜> 256<🎜><🎜><🎜>
<🎜><🎜>E_USER_ERROR<🎜>
<🎜>
utilisateur fatal erreurs générées. Ceci est similaire à E_ERROR défini par le programmeur à l'aide de la fonction PHP trigger_error().
<🎜 > <🎜><🎜> 512<🎜><🎜><🎜>
<🎜><🎜>E_USER_WARNING<🎜>
Avertissement non fatal généré par l'utilisateur. Ceci est similaire au E_WARNING défini par le programmeur à l'aide de la fonction PHP trigger_error().

     

    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 的一部分)
     <🎜><🎜>    1024<🎜><🎜>< /td>
<🎜>
><🎜> <🎜>E_USER_NOTICE<🎜>
用户生成Le PHP utilise trigger_error() pour E_NOTICE.
<🎜>     <🎜><🎜>    4096<🎜><🎜> <🎜>
><🎜><🎜>
<🎜><🎜>E_RECOVERABLE_ERROR<🎜>
valign= "top" style="border-width: 1px; style de bordure : solide ; word-break: break-all;"><🎜>     <🎜><🎜>    8191<🎜><🎜><🎜>
<🎜><🎜>E_ALL<🎜>
所有错误和警告。(在 PHP 5.4 中,E_STRICT et E_ALL 的一部分)

Maintenant, créons une fonction qui gère les erreurs :

<?php
header("Content-type:text/html;charset=utf-8");
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "脚本结束";
    die();
}
?>

Le code ci-dessus est un 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 la déclencher.


Définir le gestionnaire d'erreurs

Le gestionnaire d'erreurs par défaut de PHP est intégré gestionnaire d'erreurs. 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 allons utiliser notre gestionnaire d'erreurs personnalisé pour toutes les erreurs :

set_error_handler("customError");

Depuis nous voulons que notre fonction personnalisée gère toutes les erreurs, set_error_handler() ne nécessite qu'un seul paramètre et un deuxième paramètre peut être ajouté pour spécifier le niveau d'erreur


Exemple

Nous combinons les connaissances que nous avons apprises ci-dessus et essayons de générer des variables inexistantes pour tester ce gestionnaire d'erreurs :

<?php
header("Content-type:text/html;charset=utf-8");
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr";
}
// 设置错误处理函数
set_error_handler("customError");
// 触发错误
echo($test);
//关闭了所有的错误显示
error_reporting(0);
//显示所有错误
//error_reporting(E_ALL);
//显示所有错误,但不显示提示
//error_reporting(E_ALL & ~ E_NOTICE);
?>

Résultat de l'exécution du programme :

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

Le résultat de l'exécution nous indique que le niveau d'erreur est 8 , et le message d'erreur est : Une variable inexistante


déclenche une erreur

où l'utilisateur saisit des données dans le script, utile pour 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
header("Content-type:text/html;charset=utf-8");
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1");
}
?>

Résultat de l'exécution du programme :

Remarque : La valeur de la variable doit être inférieure ou égale à 1 dans D:WWWAdvanced tutorielerrorerror_1.php en ligne 6


Vous pouvez déclencher des erreurs n'importe où dans le script, et en ajoutant un 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
header("Content-type:text/html;charset=utf-8");
// 错误处理函数
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);
}
?>

Résultat de l'exécution du programme :

Erreur : [512] La valeur de la variable doit être inférieure à ou égal à 1
Le script se termine

Le résultat de l'exécution nous indique que la valeur du niveau d'erreur est 512. Le message d'erreur devient le message d'invite que nous avons défini avec la fonction trigger_error


Journalisation des erreurs

Dans certaines entreprises, il existe des systèmes spéciaux de collecte de journaux. Le système de collecte de journaux vous aidera silencieusement à collecter les erreurs, les avertissements et les invites en coulisse.

Certaines entreprises ne disposent pas non plus d'un système de collecte de journaux dédié et collectent les journaux en cours d'exécution à partir du serveur via des fichiers.

Parmi eux : les erreurs et avertissements PHP doivent être reçus.

Ensuite, la question se pose : si le niveau de rapport d'erreurs est défini bien avant que les utilisateurs puissent le voir, comment collecter les erreurs dans le système de journalisation ?

Voici les éléments de configuration pertinents qui doivent être utilisés dans php.ini. Ces deux éléments de configuration sont :

< / tr>< tr >< / tableau>

Exemple

<?php
//无法连接到数据库服务器,直接记录到php.ini 中的error_log指定位置
error_log("无法连接到数据库服务器服务器");
//可以发送邮件,但是php.ini必须配置过邮件系统
error_log('可以用邮件报告错误,让运维人员半夜起床干活',1 ,'liwenkai@phpxy.com');
//记录在指定的位置
error_log("我是一个错误哟", 3, "d:/test/my-errors.log");
?>

Exemple

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
 //error handler function
 function customError($errno, $errstr)
 {
     echo "<b>Error:</b> [$errno] $errstr<br />";
     echo "Webmaster has been notified";
     error_log("Error: [$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("Value must be 1 or below",E_USER_WARNING);
 }
 ?>

Résultat de l'exécution du programme :

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

L'e-mail reçu à partir du code ci-dessus ressemble à ceci :

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

Cette 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.

Remarque : L'envoi d'e-mails dans error_log peut ne pas être familier aux débutants, vous n'avez donc pas besoin de maîtriser certaines connaissances.


error_reporting signalant le type d'erreur

error_reporting fait référence au Rapport d'erreur. Il existe également un tel paramètre dans php.ini. ce paramètre. Détermine les types d'erreurs que le moteur PHP enregistre, rapporte et affiche.

1. Définissez le paramètre error_reporting dans php.ini. Si le paramètre error_reporting est défini sur 0. Les erreurs dans l’ensemble du moteur PHP ne seront ni affichées, ni affichées, ni enregistrées. Il ne sera pas enregistré dans la journalisation qui sera abordée dans le chapitre suivant.

Si nous voulons afficher toutes les erreurs, nous pouvons écrire :

error_reporting = E_ALL

Voulez afficher toutes les erreurs mais exclure Astuce, vous pouvez écrire ce paramètre comme :

error_reporting = E_ALL & ~ E_NOTICE

Afficher toutes les erreurs, mais exclure les invites, la compatibilité et Compatibilité future. Peut s'écrire :

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED


2. Dans certains cas, nous n'avons pas l'autorisation d'utiliser le fichier php.ini, mais que devons-nous faire si nous voulons contrôler error_reporting ?

Au début du fichier xxxx.php en cours d'exécution, nous pouvons utiliser la fonction error_reporting() pour atteindre l'objectif.

<?php
//关闭了所有的错误显示
error_reporting(0);
//显示所有错误
//error_reporting(E_ALL);
//显示所有错误,但不显示提示
//error_reporting(E_ALL & ~ E_NOTICE);
?>

Vous pouvez essayer le code ci-dessus et essayer d'écrire intentionnellement le mauvais code. Indique si l'erreur spécifiée sera affichée dans le fichier actuel.

[Développer et comprendre les points de connaissance] :

@ Le symbole est une seule ligne que nous avons apprise auparavant qui n'affiche pas d'erreurs, veuillez ne pas utiliser ou utiliser moins de symbole @.


Instance

Lisons un fichier inexistant et démontrons le processus d'implémentation avec ce code php :

<?php
//读取一个不存在的adsaf.txt文件,用@符抑制错误
@$fp = fopen('adsaf.txt','r');
?>
    @符效率较低,它在php内核中的实现过程是:
<?php
//关闭错误
error_reporting(0);
//读取一个不存在的文件,显示错误
//显示错误
error_reporting(E_ALL & ~ E_NOTICE);
?>



Formation continue
||
<?php header("Content-type:text/html;charset=utf-8"); // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } // 设置错误处理函数 set_error_handler("customError"); // 触发错误 echo($test); //关闭了所有的错误显示 error_reporting(0); //显示所有错误 //error_reporting(E_ALL); //显示所有错误,但不显示提示 //error_reporting(E_ALL & ~ E_NOTICE); ?>
soumettreRéinitialiser le code
  • Recommandations de cours
  • Téléchargement du didacticiel
    错误消息类型      说明
     0发送至默认的error_log指定位置
     1 发送到指定的邮件位置
     3发送至指定的文件位置
<🎜> Type de message d'erreur<🎜><🎜>
<🎜><🎜> Description<🎜><🎜>
0 Envoyer à l'emplacement spécifié par défaut du journal d'erreurs
1 Envoyer à l'emplacement de messagerie spécifié
3Envoyer à l'emplacement de fichier spécifié