background image

深圳市一览网络股份有限
公司
ShenZhen Elanw Network 

Co.,Ltd.

地址:南山科技园南区数字技术园
B2 栋 4A 
Add: Room A,4th Floor,Block 
B2,Digi-Tech Park ,

电话(Tel):0755-86133725
传真(Fax):0755-22632616
网址
(Web):www.YL1001.com

 

本文详细介绍

PHP set_error_handler()函数

的使用方法,最后还提供了一个实例
我们写程序,难免会有问题(是经常会遇到问题

 ),而 PHP 遇到错误时,就会给出出错脚本的位置、行

数和原因。有很多人说,这并没有什么大不了。确实,在调试程序阶段,这确实是没啥的,而且我认为给
出错误路径是必要的。
但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很
多的服务器都存在这个问题。有些网管干脆把

PHP 配置文件中的 display_errors 设置为 Off 来解决(貌似我

们就是这样做的),但本人认为这个方法过于消极。
有些时候,我们的确需要

PHP 返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待,甚至

导航到另一页面。那么,有啥解决办法呢?
set_error_handler()
PHP 从 4.1.0 开始提供了自定义错误处理句柄的功能函数 set_error_handler(),但很少数脚本编写者知道 。
set_error_handler 这个函数可以很好地防止错误路径泄露,当然还有其它更多的作用。
可以用来屏蔽错误。

 出现错误一来会把一些信息暴漏给用户,极有可能成为黑客攻击你网站的工具。 二来

让用户觉得你的水平很挫。
可以记下错误的信息,

 及时发现一些生产环境的出现的问题。

可以做相应的处理,

 出错的时候可以显示跳转到预先定义好的出错页面,提供更好的用户体验。 

可以作为调试工具,

 一些时候必须在生产环境调试一些东西, 但又不想影响正在使用的用户。

set_error_handler 的使用方法如下:
复制代码

 代码如下:

string set_error_handler ( callback error_handler [, int error_types])
 
现在我们就用自定义的错误处理把实际路径过滤掉。假设有一个变量

$admin

,我们是用来判断访问者是否

是管理员的(可以通过

IP 或者登录的用户 id 来做这个判断)

复制代码

 代码如下:

//admin 为管理员的身份判定,true 为管理员。  
//自定义的错误处理函数一定要有这4个输入变量$errno,$errstr,$errfile,$errline,否则无效。  
function

 my_error_handler(

$errno

,

$errstr

,

$errfile

,

$errline

)  

{  

    

//如果不是管理员就过滤实际路径  

    

if

(!admin)  

    

{  

        

$errfile

=

str_replace

(

getcwd

(),"",

$errfile

);  

        

$errstr

=

str_replace

(

getcwd

(),"",

$errstr

);  

    

}  

    

switch

(

$errno

)  

    

{  

        

case

 E_ERROR:  

        echo

 "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n";  

        echo

 "程序已经停止运行,请联系管理员。";  

        

//遇到 Error 级错误时退出脚本  

        exit

;  

        

break

;