当前位置:首页 > PHP教程 > 正文内容

关于PHP框架中日志系统的详解_php教程,PHP

搜教程4年前 (2020-03-05)PHP教程161

PHP 加密:Password Hashing API_php教程

PHP 5.5 之后引入 Password hashing API 用于创建和校验哈希密码,它属于内核自带,无需进行任何扩展安装和配置。它主要提供了四个函数以供使用:

引言

接触过php框架的朋友们可能都知道,日志在项目中的重要作用了,他可以帮助我们定位错误的位置,让程序更友好(处理得当的话不会直接抛出一大堆只有程序猿才真正动的英文),调试的时候也会很方便,还可以记录一些重要的操作等等,总之一个完整的项目要是没了日志系统,就已经开发的路上布满了荆棘、坑洼,肯定会磕磕绊绊的。

简介

要掌握PHP日志系统,必须先对这几点东西了解透彻。

一、php的几个函数

set_exception_handler(callback $exception_handler); //异常捕获自定义处理函数注册 
set_error_handler(callback $error_handler); //错误捕获自定义处理函数注册 
register_shutdown_function(callback $callback); //程序执行时异常终止错误捕获处理函数注册

这三个函数在错误处理控制中给开发者提供了很大的自主空间,在日志系统中记录日志信息有他们的功劳。

在程序中出现异常(exception)问题时,php内核会抛出异常错误,然后将错误信息打印给使用者,如果注册了exception处理函数,php抛出的异常会转给自定义的注册的异常捕获函数,这个函数里面包含了我们要做的处理,记录错误信息(包括错误详细内容、错误位置),该函数处理完异常后,异常就会终止。

当程序中出现error时,我们注册的error处理函数会在函数中将错误信息转化为一个错误异常对象传递给异常处理函数,也就是第一步的$exception_handler函数。

当成续重出现shutdown错误时,会执行我们注册的异常终止处理函数,该函数通过error_get_last()获取到最后的shutdown时的错误对象,接着和上一部一样,生成一个error exception对象,将该对象传递给我们注册的异常处理函数。

可以看到,其实不管是异常还是错误,都是将自己的信息转化为异常处理函数认识的异常信息,然后交给异常处理函数处理,非异常信息就像化了妆的女人一样,异常处理程序不认识这些非异常信息,只有将装卸掉(非异常信息自己转化为异常信息,准确的说应该是抛出),异常处理才认识。

php日志系统中的错误处理流程

那么现在问题来了,这几个函数一般会配合一个异常处理类库,加上一个错误日志记录类库来进行工作,异常处理类库中包含要注册的3个函数,日志记录类库在$exception_handler中调用,用来合理的记录和放置日志文件的位置,上面说到的几个函数一般是在程序框架入口处进行加载注册的,就像下面这样:

php实现根据身份证获取年龄_php教程

php实现根据身份证获取年龄的方法:1、从身份证获取出生日期;2、格式化出生日期;3、格式化当前日期;4、计算年龄。

这里面用的是array(class,function)这种方式。

set_exception_handler(array("Myexception","exceptionHandler"));
set_error_handler(array("Myexception","errorHandler"));
register_shutdown_function(array("Myexception","shutdownHandler"));

二、日志记录相关类库

第一部分介绍到的东西只是对异常、错误、shutdown进行了捕获,这只是第一步,接下来还要对捕获到的信息进行合理的处理,比如说记录这些日志信息到本地文件系统中(这个操作是在array(“Myexception”,”exceptionHandler”)),这个地方就用到了日志记录类库。(下面要说的类库是借鉴了kohana日志系统的设计)。

日式日志记录也很简单只要做的将信息添加到文件末尾就行,这个很容易实现,相信大家都可以自己实现,但是要设计出一个便捷的、高效的、扩展的日志记录类库就不那么简单了,要经过长时间的实践总结优化才可以,kohana框架中的日志记录类库已经比较成熟了,因此这里拿来借鉴。

相信使用过kohana的用户一定对kohana框架中的日志记录比较熟悉,不熟悉也没关系,我下面会大概的说说,在kohana源码中的application/bootstrap.php文件中的第109——112行可以看到下面的代码:

/**
* Attach the file write to logging. Multiple writers are supported.
*/
Kohana::$log->attach(new Log_File(APPPATH.'logs'));

这个就是添加一个日志记录对象到日志对象中,注意橄榄色打底的俩个,他们是不同的类库实例,在kohana中,日志记录对象分为两部分,第一部分就是日志对象,用来维护一个日志记录对象的列表,这个要怎么理解呢,其实就像一个容器,里面包含了一个或多个日志记录对象(这个就是第二部分,这些日志记录对象才是真正来记录日志的),还有每个对象要记录的错误等级的数组,当满足错误等级的时候才会去记录,不满足就会略掉。下面是我自己简化重命名后的日志记录方式:

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培训》

以上就是关于PHP框架中日志系统的详解的详细内容,更多请关注ki4网其它相关文章!

简单意义上的桶排序(PHP实现)_php教程

桶排序的原理是先安排N+1个桶作为容器,若数据范围为N的话。然后将测试数据(所需排序的数据)进行循环,放入对应的桶内。数据一定是在范围N内的。最后,循环桶里的元素,并且输出,进行从大到小或从小到大的排序。

扫描二维码推送至手机访问。

版权声明:本文由搜教程网发布,如需转载请注明出处。

本文链接:https://www.sojiaocheng.cn/17334.html

标签: PHP
分享给朋友:

“关于PHP框架中日志系统的详解_php教程,PHP” 的相关文章

PHP中的public,private和protected的区分【php教程】,PHP,public,private,protected

PHP中的public,private和protected的区分【php教程】,PHP,public,private,protected

public,private和protected称为 接见修饰符。就像C ++一样,PHP也有三个接见修饰符,如public,private和protected。能够经由过程在声明前加上这些关键字来定义属性,要领或常量的可见性。 1.如果类成员声明为public,那末它能够在任何地方接见...

怎样运用php中的file_get_contents()函数将文件内容读入字符串【php教程】,php

怎样运用php中的file_get_contents()函数将文件内容读入字符串【php教程】,php

php中的file_get_contents()函数是用于将文件内容读入字符串的。此函数还能够从URL读取内容,下面 我们就来细致看看php中的 file_get_contents()函数将文件内容读入字符串的要领。 我们先来看一下php中的 file_get_contents()函数...

jsp和php哪一个好?jsp和php的简朴比较【php教程】,jsp,php

jsp和php哪一个好?jsp和php的简朴比较【php教程】,jsp,php

jsp和php这两个Web开辟手艺哪一个好?这个题目应当会有很多人问,然则每种开辟手艺都有各自的优缺点,所谓的哪一个好,不过是看你更善于运用哪种手艺,所以本日我们来对照一下jsp和php,引见jsp和php之间有什么区别。 1、jsp和php的言语比较 PHP是一种专为Web开辟而设想的...

PHP中session_unset()和session_destroy()的区分是什么【php教程】,session_unset(),session_destroy(),PHP

PHP中session_unset()和session_destroy()的区分是什么【php教程】,session_unset(),session_destroy(),PHP

在PHP中有两个异常类似的函数session_unset()和session_destroy(),它们二者都是用于删除注册到会话的一切变量,那末它们之间有什么差别?下面本篇文章就来给人人引见一下session_unset()和session_destroy()的区分,愿望对人人有所协助。【视频教程引...

PHP如何将字符串剖析为多个变量?(代码示例)【php教程】,PHP字符串解析为变量

PHP如何将字符串剖析为多个变量?(代码示例)【php教程】,PHP字符串解析为变量

parse_str()函数是PHP中的内置函数,其作用就是将查询的字符串剖析为变量。通报给此函数举行剖析的字符串采纳经由过程URL通报的查询字符串的花样。 语法 : parse_str($string, $array) 参数: 该函数接收如上语法所示的两个参数,个中必需供应第一个参数...

如安在Windows上装置PHP7?【php教程】,Windows安装PHP7

如安在Windows上装置PHP7?【php教程】,Windows安装PHP7

本篇文章中,我们将给人人引见在Windows上装置PHP7版本的简朴步骤,愿望对须要的朋侪有所协助! 1. 下载并装置PHP7 起首,你须要在https://windows.php.net/download下载所需的PHP版本,在我的示例中,我将下载PHP7.2的zip文件 下载后...