文章教程

5.10共通功能——由Zend_Log实现的共同错误提示页与履历输出功能

9/17/2020 9:43:31 PM 人评论 次浏览

5.10 共通功能——由Zend_Log实现的共同错误提示页与履历输出功能

在PHP中,发生错误时,标准情况下要输出详细的信息。的确,这些信息对开发人员来是非常重要的信息。但是,另一方面在trace信息中包含了许多不想让终端用户知道的信息,公开后会带来危险。

例如服务器端的代码中包含了许多如数据库的接续信息,如用户ID/密码等,本来应该对终端用户隐藏的信息,有时trace错误信息中会将这些泄露出来了。应该尽量避免出现显示这些错误信息的情况,不幸的是,不可避免地会出现这种情况。有时不仅不能向用户提供简单易懂的错误提示,也为恶意的黑客提供可以用于攻击的安全漏洞。

在本节中,将会对应用程序下的错误提示页面进行定制,给终端用户提供一个简单易懂的错误提示的同时,将对开发人员有用的信息也记录在履历文件中。

alt

简单易懂的错误提示

alt

履历文件

要点

在Zend Framework(Zend_Controller)中,提供了errorcontroller的构架。errorcontroller就是module名/controller名/action名为“default/error/error”的actioncontroller。errorcontroller当应用程序不能处理的例外发生时被自动调用。这里,利用这个errorcontroller,显示定制后的错误页面。

另外,使用Zend Framework的组件之一的Zend_Log来完成例外信息的记录。Zend_Log,顾名思义,就是记录履历的组件,具有如下的特征。

能自由地变更履历的输出方式(支持多种输出方式的组合),如标准输出、文件输出、数据库输出等。自由地变更输出的格式。通过设置履历水平,能够实现履历的过滤(Filtering)。

在使用Zend_Log程序库后,不需要意识履历记录的步骤,履历记录处理能够更简单地记录履历。

目录结构

alt

定义ErrorControler类的errorAction方法。

alt

使用Zend_Log_Writer_Stream类(writer类,关于writer类参见补充资料)管理向文件系统的履历输出。在Zend_Log_Writer_Stream的构造函数的参数中指定履历的输出目录。

alt

Zend_Log类用于控制履历的输出。在Zend_Log的构造函数参数中设定上面生成的Zend_Log_Writer_Stream对象。

另外,addFilter方法用于设定输出对象的履历水平(参照后面的补充资料)。这里指定为Zend_Log::ERR,错误以上的履历才被输出。

alt

例外信息的取得使用应答对象的getException方法,getException方法将发生的例外信息以Exception对象数组的形式返回。这了使用foreach命令顺序取出,将其中的例外信息/发生对象在履历中输出。

方法log是实际输出履历的方法,在其第2个参数中指定履历的水平。注意,这里指定的履历水平与上面指定的履历水平,并不是一回事。

alt

调用定制错误页面(error/error.tpl)。

alt

表示定制错误提示页的模拟动作。使用throw命令故意抛出意外。

alt

补充

Zend_Log中可以使用的履历水平

在要点中已经介绍过,Zend_Log中以履历水平为基准来判断指定的履历是否会输出。各个履历,在没有满足事先设定的履历水平的情况下,这些履历是不会输出的。

利用这个履历输出构架,例如想实现在开发阶段将所有的履历都输出,而在系统发布后,只输出致命级别的履历时,不用修改每一个履历输出语句,只用改变履历水平,就可以自由的上述两种履历切换。

Zend_Log中可以使用的履历水平在表5-20中一一列出了。Zend_Log::EMERG是最高的履历水平,Zend_Log::DEBUG是最低的履历水平。

表5-20 Zend_Log中可以使用的履历水平

alt

alt

Zend_Log的writer类与格式

在Zend_Log组件中,提供与输出目录对应的Writer类,以及决定输出格式的Formatter。通过在这些Writer与Formatter间的切换,自由地改变履历的输出目录与格式。这正是Zend_Log优越的地方。

表5-21显示了Zend_Log中的Writer与Formatter一览。

表5-21 Zend_Log中的Writer与Formatter

alt

关于Writer与Formatter的详细资料,这里就不赘述了,有兴趣的朋友可以参照Zend Framework的开发文档(http://framework.zend.com/manual/zh/)。

教程类别