我们利用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