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

张映 发表于 2010-08-10

分类目录: php

标签:, ,

我们利用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这样的函数就很爽了。

个人做了一个小测试

<?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来控制和处理。



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/php/966.html