弁言
打仗过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中挪用,用来合理的纪录和安排日记文件的位置,上面说到的几个函数平常是在顺序框架入口处举行加载注册的,就像下面如许:
这内里用的是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教程!
以上就是PHP 框架中的日记体系的细致内容,更多请关注ki4网别的相干文章!