Maison >développement back-end >tutoriel php >Explication détaillée du système de journalisation dans le framework PHP
Introduction
Les amis qui ont été exposés au framework PHP connaissent peut-être le rôle important des journaux dans le projet. Cela peut nous aider à localiser les erreurs et à rendre le programme plus convivial (si. géré correctement, il ne jettera pas directement beaucoup d'anglais que seuls les programmeurs peuvent réellement utiliser), il sera très pratique lors du débogage, et il pourra également enregistrer certaines opérations importantes, etc. Bref, si un projet complet n'a pas un système de rondins, La route vers le développement est déjà pleine d'épines et de nids-de-poule, et il y aura certainement des bosses sur la route.
Introduction
Pour maîtriser le système de journalisation PHP, vous devez d'abord avoir une compréhension approfondie de ces choses.
1. Plusieurs fonctions de PHP
set_exception_handler(callback $exception_handler); //异常捕获自定义处理函数注册 set_error_handler(callback $error_handler); //错误捕获自定义处理函数注册 register_shutdown_function(callback $callback); //程序执行时异常终止错误捕获处理函数注册
Ces trois fonctions offrent aux développeurs une grande autonomie dans le contrôle de la gestion des erreurs, et dans le système de journalisation Les informations du journal d'enregistrement ont leur mérites.
Lorsqu'une exception se produit dans le programme, le noyau PHP génère une erreur d'exception, puis imprime le message d'erreur à l'utilisateur. Si la fonction de gestion des exceptions est enregistrée, l'exception lancée par PHP se transmettra à lui-même. . La fonction de capture d'exception enregistrée définie contient le traitement que nous devons effectuer et enregistre les informations sur l'erreur (y compris les détails de l'erreur et l'emplacement de l'erreur). Une fois que la fonction a traité l'exception, l'exception se terminera.
Lorsqu'une erreur se produit dans le programme, la fonction de gestion des erreurs que nous avons enregistrée convertira les informations d'erreur en un objet d'exception d'erreur dans la fonction et les transmettra à la fonction de gestion des exceptions, qui est la fonction $exception_handler dans le premier pas.
Lorsqu'une erreur d'arrêt se produit lors de la reprise, la fonction de traitement de fin anormale que nous avons enregistrée sera exécutée. Cette fonction obtient l'objet d'erreur du dernier arrêt via error_get_last(), puis génère une erreur comme la partie précédente. .objet d'exception, transmettez cet objet à notre fonction de gestion des exceptions enregistrée.
Comme vous pouvez le voir, qu'il s'agisse d'une exception ou d'une erreur, il convertit ses propres informations en informations d'exception reconnues par la fonction de gestion des exceptions, puis les transmet à la fonction de gestion des exceptions pour traitement. Les informations d'exception sont comme le maquillage.Tout comme les femmes, le gestionnaire d'exceptions ne reconnaît pas ces informations non exceptionnelles uniquement en supprimant le chargement et le déchargement (les informations non exceptionnelles elles-mêmes sont converties en informations exceptionnelles, pour être précis, elles doivent être levées. ), le gestionnaire d'exceptions le reconnaîtra.
Processus de gestion des erreurs dans le système de journalisation PHP
Vient ensuite le problème. Ces fonctions sont généralement combinées avec une bibliothèque de gestion des exceptions, plus une journalisation des erreurs. La bibliothèque de classes de gestion des exceptions contient 3 fonctions à enregistrer. La bibliothèque de classes de journalisation est appelée dans $exception_handler pour enregistrer et placer raisonnablement l'emplacement du fichier journal. La fonction A mentionnée ci-dessus est généralement chargée et enregistrée. à l'entrée du framework du programme, comme suit :
La méthode array(class, function) est utilisée ici.
set_exception_handler(array("Myexception","exceptionHandler")); set_error_handler(array("Myexception","errorHandler")); register_shutdown_function(array("Myexception","shutdownHandler"));
2. Bibliothèques de classes liées à la journalisation
Les éléments introduits dans la première partie ne capturent que les exceptions, les erreurs et les arrêts. Ce n'est que la première étape. nous devons traiter les informations capturées de manière raisonnable, par exemple en enregistrant les informations du journal sur le système de fichiers local (cette opération est dans array("Myexception", "exceptionHandler")), où la bibliothèque de classes de journalisation est utilisée. (La bibliothèque de classes mentionnée ci-dessous s'appuie sur la conception du système de journalisation kohana).
La journalisation à la japonaise est également très simple. Tout ce que vous avez à faire est d'ajouter les informations à la fin du fichier. C'est facile à mettre en œuvre, je pense que chacun peut le mettre en œuvre par lui-même, mais c'est nécessaire. pour concevoir un journal pratique, efficace et étendu. La bibliothèque de classes de journalisation n'est pas si simple. Elle doit être résumée et optimisée après une longue période de pratique. La bibliothèque de classes de journalisation dans le framework kohana est relativement mature, nous pouvons donc l'utiliser. ici pour référence.
Je pense que les utilisateurs qui ont utilisé kohana doivent être familiers avec la journalisation dans le framework kohana. Peu importe si vous ne le connaissez pas, j'en parlerai brièvement ci-dessous, dans l'application/. bootstrap.php dans le code source de kohana. Vous pouvez voir le code suivant aux lignes 109-112 :
/** * Attach the file write to logging. Multiple writers are supported. */ Kohana::$log->attach(new Log_File(APPPATH.'logs'));
Il s'agit d'ajouter un objet de journalisation à l'objet journal. Faites attention aux deux avec un fond olive. Ce sont des instances de bibliothèque de classes différentes. Dans Kohana, l'objet de journalisation est divisé en deux parties. La première partie est l'objet de journalisation, qui est utilisé pour maintenir une liste d'objets de journalisation. Comment comprendre cela ? qui contient un ou plusieurs objets de journalisation (c'est la deuxième partie, ces objets de journalisation sont en fait utilisés pour enregistrer des journaux), et il existe un tableau de niveaux d'erreur à enregistrer pour chaque objet. Il ne sera enregistré que lorsque le niveau d'erreur. est remplie, et elle sera omise si ce n’est pas le cas. Ce qui suit est ma propre méthode de journalisation simplifiée après avoir renommé :
self::$log = Log::instance(); self::$log->attach(new Logwriter("./data/debug"),Log::DEBUG); self::$log->attach(new Logwriter("./data/notice"),Log::NOTICE);
我这里面为了更好地理解,将“容器”命名为Log,记录的实例命名为Logwriter,可以看到我在程序入口处很容易的添加了两不同的日志种类,第一个是记录所有错误号比Log::DEBUG小的错误(错误级别比他高),并按规则记录在文件夹./data/debug下面,第二个是记录级别等于或高于Log::NOTICE的错误,当然了你还可以更详细制定具体哪些错误好,传递数组就行了,这个就是我感觉方便、快捷的地方,我们可以根据需求来添加错误日志、分不同的日志目录,下面看一幅图也许会有助于理解:
log与logwriter的关系
通过上面的图你就会看到Log是一个容器,包含了具体的不同的logwriter对象,每个对象可能要记录不同的信息,当错误信息要刷到文件中的时候,会运行每一个Logwriter实例,看看自己是否要记录errormessage中的错误,errormessage中的level不包含在Logwriter内时忽略。
这本分和第一部分怎么合作的呢?
其实很简单,当exception捕获的异常时会调用添加一条错误信息(包括错误位置、错误代号、错误信息等信息)到Log容器中的errormessage数组中,然后当程序结束之后在将这些信息写入文件,这里还要注意下,也许你在阅读kohana代码是发现没有明显的直接写入到日志中去,这里面kohana优化的比较好,因为php的一次执行可能出现多个错误,如果来一个错误你就去记录一次这样会在程序返回之前占用多余的io和时间,所以kohana的做法是默认将所有的错误、异常、日志存放在Log::$errormessage中,并在实例化的时候讲Log中的writer操作注册register_shutdown_function,这个函数的作用是在程序异常终止或者执行完成之后执行,前面第一部分也有使用到,这样日志记录就不会对本次php的执行产生带大的影响。
推荐:《PHP培训》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!