php函数set_error_handler用法,管理报错信息

字体大小: 中小 标准 ->行高大小: 标准
我们利用error_reporting();看到的错误信息包括三个部分,错误信息,错误文件的绝对地址,错误出现的行数。其实还有一个是错误类型。Array ( [type] => 1 [message] => Call to undefined method SomeClass::somemedthod() [file] => /home/zhangy/www/aaaa/stasdf.php [line] => 67 ),页面的绝对路径最好不要暴露给别人,不然给有些人可称之机,为了杜绝这一点,好多人都会采用,ini_set("display_errors",0);直接把错误信息给屏蔽掉了。这样就不方便了,如果我们要看信息怎么办呢?每次查看的时候,是不是都要改一下代码,或者是改一下apache的配置,在重起一下呢?

php有函数set_error_handler可以解决这个问题

用法如下:

mixed set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )

php函数register_shutdown_function也可以解决这个问题

用法如下:

int register_shutdown_function ( string $func )

个人觉得报错函数自己定义,至少有三点好处,

1,不会把文件的绝对路径显示出来,安全些

2,即使真的出现了错误信息,我们可以对错误信息进行处理,让用户也看不到fatal error这样的东西。用户体验要好

3,项目上线后,有的时候,你还是要帮用户去解决问题,这个时候难免要去修改代码,但是我们又要让错误信息报出来,又不能让用户看到,这个时候,用set_error_handler这样的函数就很爽了。

个人做了一个小测试

查看复制打印?
1.<?php 
2.error_reporting(0); 
3.4.register_shutdown_function('error_alert'); 
5.function error_alert() 
6.{ 
7.if(is_null($e = error_get_last()) === false) 
8.{ 
9.set_error_handler('errorHandler'); 
10.if($e['type'] == 1){ 
11.trigger_error("fatal error", E_USER_ERROR); 
12.}elseif($e['type'] == 8){ 
13.trigger_error("notice", E_USER_NOTICE); 
14.}elseif($e['type'] == 2){ 
15.trigger_error("warning", E_USER_WARNING); 
16.}else{ 
17.trigger_error("other", E_USER_OTHER); 
18.} 
19.20.}else{ 
21.echo "no error"; 
22.} 
23.} 
24.25.set_error_handler('errorHandler'); 
26.27.function errorHandler($errno, $errstr, $errfile, $errline,$errcontext) 
28.{ 
29.switch ($errno) { 
30.case E_USER_ERROR: 
31.echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; 
32.echo " Fatal error on line $errline in file $errfile"; 
33.echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; 
34.break; 
35.36.case E_USER_WARNING: 
37.echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; 
38.echo " warning on line $errline in file $errfile"; 
39.echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; 
40.break; 
41.42.case E_USER_NOTICE: 
43.echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; 
44.echo " notice on line $errline in file $errfile"; 
45.echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; 
46.break; 
47.48.default: 
49.echo "Unknown error type: [$errno] $errstr<br />\n"; 
50.echo " warning on line $errline in file $errfile"; 
51.echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; 
52.break; 
53.} 
54.55.return true; 
56.} 
57.58.class SomeClass { 
59.public function someMethod() { 
60.61.} 
62.} 
63.64.SomeClass::someMedthod(); 
65.66.$a="asdf"; 
67.foreach($a as $d){ 
68.echo $d; 
69.} 
70.?> 
<?php
error_reporting(0);

register_shutdown_function('error_alert');
function error_alert()
{
 if(is_null($e = error_get_last()) === false)
 {
 set_error_handler('errorHandler');
 if($e['type'] == 1){
 trigger_error("fatal error", E_USER_ERROR);
 }elseif($e['type'] == 8){
 trigger_error("notice", E_USER_NOTICE);
 }elseif($e['type'] == 2){
 trigger_error("warning", E_USER_WARNING);
 }else{
 trigger_error("other", E_USER_OTHER);
 }

 }else{
 echo "no error";
 }
} 

 set_error_handler('errorHandler');

function errorHandler($errno, $errstr, $errfile, $errline,$errcontext)
{
 switch ($errno) {
 case E_USER_ERROR:
 echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
 echo "  Fatal error on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
 break;

 case E_USER_WARNING:
 echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
 echo "  warning on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
 break;

 case E_USER_NOTICE:
 echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
 echo "  notice on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
 break;

 default:
 echo "Unknown error type: [$errno] $errstr<br />\n";
 echo "  warning on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
 break;
 }

 return true;
}

class SomeClass {
 public function someMethod() {

 }
}

SomeClass::someMedthod();

$a="asdf";
foreach($a as $d){
 echo $d;
}
?>上面的例子中,我把错误信息关掉了,而用自己的函数处理错误,上面的这个页面会报fatal error,报出来的错误信息我们是可以利用errorHandler来控制和处理。

0

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/67511.html