更多优质内容
请关注公众号

PHP基础(十一) PHP错误处理-张柏沛IT博客

正文内容

PHP基础(十一) PHP错误处理

栏目:PHP 系列:PHP基础系列 发布时间:2019-11-26 14:11 浏览量:2263

PHP程序的错误发生一般归属于下列三个领域:

语法错误:
语法错误最常见,并且也容易修复。如:代码中遗漏一个分号。这类错误会阻止脚本的执行。

运行时错误:
这种错误一般不会阻止PHP脚本的执行,但会阻止当前要做的事情。输出一条错误,但php脚本继续执行

逻辑错误:
这种错误最麻烦,既不阻止脚本执行,也不输出错误消息。

一个异常(后面面向对象时会讲)则是在一个程序执行过程中出现的一个例外,或是一个事件,它中断了正常指令的运行,跳转到其他程序模块继续执行。


PHP的错误报错级别

级别常量

错误值

错误报告描述

E_ERROR

1

致命的运行时错误(阻止脚本执行)

E_WARNING

2

运行时警告(非致命性错误)

E_PARSE

4

从语法中解析错误

E_NOTICE

8

运行时注意消息(可能是或可能不是一个问题) 

E_CORE_ERROR

16

PHP启动时初始化过程中的致命错误

E_CORE_WARNING

32

PHP启动时初始化过程中的警告(非致命性错)

E_COMPILE_ERROR

64

编译时致命性错 

E_COMPILE_WARNING

128

编译时警告(非致命性错) 

E_USER_ERROR

256

用户自定义的致命错误 

E_USER_WARNING 

512

用户自定义的警告(非致命性错误)

E_USER_NOTICE

1024

用户自定义的提醒(经常是bug) 

E_STRICT

2048

编码标准化警告(建议如何修改以向前兼容) 

E_ALL

6143

所有的错误、警告和注意信息


调整错误报告级别

display_errors: 是否开启PHP输出错误报告的功能
值为:On(默认输出错误报告)、 Off(屏蔽所有错误信息)

在PHP脚本中可调用ini_set( )函数,动态设置php.ini配置文件
如:ini_set("display_errors","On"); //显示所有错误信息

error_reporting: 设置不同的错误报告级别。
error_reporting = E_ALL & ~E_NOTICE
   -- 可以抛出任何非注意的错误,默认值
error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR
   -- 只考虑致命的运行时错误、新解析错误和核心错误。
error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)
   -- 报告除用户导致的错误之外的所有错误。
   
在PHP脚本可以通过error_reporting( )函数动态设置错误报告级别。如:error_reporting(E_ALL);

<html>
    <head><title>测试错误报告</title></head>
    <body>
        <h2>测试错误报告</h2>
        <?php
            /*开启php.ini中的display_errors指令,只有该指令开启如果有错误报告才输出*/
            ini_set('display_errors', 1);  
            /*通过error_reporting()函数设置在本脚本中,输出所有级别的错误报告*/
            error_reporting( E_ALL );
            /*“注意(notice)”的报告,不会阻止脚本的执行,并且可能不一定是一个问题 */
            getType( $var );             //调用函数时提供的参数变量没有在之前声明
            /*“警告(warning)”的报告,指示一个问题,但是不会阻止脚本的执行 */
            getType();                      //调用函数时没有提供必要的参数
            /*“错误(error)”的报告,它会终止程序,脚本不会再向下执行 */
            get_Type();                     //调用一个没有被定义的函数
        ?>
    </body>
</html>


确定PHP错误报告行为的配置指令

配置指令

默认值

描述

display_startup_errors

Off

是否显示PHP引擎在初始化时遇到的错误

log_errors

Off

确定日志语句记录位置

error_log

Null

设置错误可以发送到syslog中

log_errors_max_len

1024

每个日志项的最大长度,以字节为单位,设置0表示指定最大长度。

ignore_repeated_errors

Off

是否忽略同一个文件、同一行发生的重复错误消息

ignore_repeated_source

Off

忽略不同文件中和同一文件中不同行发生的重复错误。

track_errors

Off

启动该指令会使PHP在$php_errormsg中存储最近发生的错误信息。 



使用trigger_error()函数来替代die()

首先函数die()等同于exit(),两者如果执行都会终止PHP程序,而且可以在退出程序之前输出一些错误报告。
trigger_error()则可以生成一个用户警告来代替,使程序更具有灵活性。
例如,trigger_error(“没有找到文件”,E_USER_ERROR)。使用trigger_error()函数来替代die(),你的代码在处理错误上会更具优势,对于客户程序员来说更容易处理错误。

自定义错误处理

自定义错误报告的处理方式,可以完全绕过标准的PHP错误处理函数,这样就可以按自己定义的格式打印错误报告,或改变错误报告打印的位置,以下几种情况可以考虑自定义错误处理。 可以记下错误的信息,及时发现一些生产环境出现的问题 可以屏蔽错误。 可以控制错误的输出。 可以作为调试工具。 使用set_error_handler()函数来设置用户自定义错误处理。


<?php
    /**
        定义Error_Handler函数,
       作为set_error_handler()的第一个参数"回调"
        @param  int     $error_level  错误级别
        @param string $error_message  错误信息
        @param  string  $file            错误所在文件
        @param  int     $lin               错误所在行数
    */
    function error_handler($error_level,
	 $error_message, $file, $line) {
          $EXIT = FALSE;
          switch( $error_level ) {
              //提醒级别
              case E_NOTICE:
              case E_USER_NOTICE :
                   $error_type = 'Notice'; break;
     	
               //警告级别
              case E_WARNING:
              case E_USER_WARNING:
                   $error_type = 'Warning'; break;
                //错误级别
               case E_ERROR:
               case E_USER_ERROR:
                      $error_type = 'Fatal Error';
                      $EXIT = TRUE; break;
                //其他末知错误
               default:
                      $error_type = 'Unknown';
                      $EXIT = TRUE; break;
        }
        //直接打印错误信息,也可以写文件或数据库
        printf ("<font color='#FF0000'><b>%s</b></font>: %s in <b>%s</b> on line <b>%d</b><br>\n", $error_type, $error_message, $file, $line);
        
        //若出现错误则跳转到友好错误提示页面
        if(TRUE === $EXIT) {
           echo '<script>location="er.html" </script>';
        }
 }

?>


通过上面测试代码可以很好解决安全和调试方面的矛盾,但注意 E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用原始的方式显示,不过通常情况下不会发生。 使用set_error_handler()后,error_reporting()将会失效。也就是所有错误都是由自定义的函数处理。

<?php    
    error_reporting(0); //屏蔽程序中的错误
    
    set_error_handler('error_handler'); //这个才是关键点,把错误的处理交给error_handler()
    
    echo $novar; //使用末定义的变量要报 notice 的
    
    echo 3/0;  //除以0要报警告的
    
    trigger_error('Trigger a fatal error', E_USER_ERROR); //自定义一个错误
?>


写错误日志

两种方式记录错误日志:

使用指定的文件记录错误报告日志

错误日志记录到操作系统的日志里


使用指定的文件记录错误报告日志

1、先配置php.ini:
error_reporting = E_ALL    //将向PHP发送每个错误
display_errors=Off         //不显示错误报告
log_errors=On              //决定日志语句记录的位置
log_errors_max_log=1024// 每个日志项的最大长度
error_log=G:/myerror.log//指定错误写进的文件

2、使用函数:在php文件中使用error_log()来记录日志,就可以将信息写入到myerror.log文件中
如:error_log("登录失败了!");

<?php   
    if(!ora_logon($username, $password)){   
        //将错误消息写入到操作系统日志中
        error_log("Oracle数据库不可用!", 0);          
    }
    
    if(!($foo=allocate_new_foo()){
        //发送到管理员邮箱中
        error_log("出现大麻烦了!", 1, "webmaster@www.mydomain.com");   
    }
    
    //发送到本机对应5000端口的服务器中
    error_log("搞砸了!",   2,   "localhost:5000");       
    //发送到指定的文件中
    error_log("搞砸了!",   3,   "/usr/local/errors.log");    
?>


错误日志记录到操作系统的日志里

1、先配置PHP.ini文件中
error_reporting = E_ALL   //将向PHP发送每个错误
display_errors=Off          //不显示错误报告
log_errors=On              //决定日志语句记录的位置。
log_errors_max_log=1024   // 每个日志项的最大长度
error_log=syslog          //指定到系统日志中。

2、使用四个函数来记录日志:
define_syslog_variables();//为系统日志初始化配置
openlog();             //打开一个日志链接
syslog();             //发送一条日志记录
closelog();                //关闭日志链接

查看日志:如windows系统,通过右击“我的电脑”-> 选择管理选项->在系统工具菜单中选择事件查看器->在应用程序选项中即可看到日志了。




更多内容请关注微信公众号
zbpblog微信公众号

如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > PHP基础(十一) PHP错误处理

热门推荐
推荐新闻