php的错误处理

 编写的程序在运行中都可能会出现一些错误或者警告等,当php解释器解释执行php文件时,如果遇到php错误,就会向外抛出问题

,具体我们可以在php.ini配置文件中进行配置。php错误分很多级别,详细如下:

  • E_ERROR : 致命运行错误,会停止脚本运行

  • E_WARNING : 运行时的警告信息,不会停止脚本运行

  • E_PARSE : 语法解析错误

  • E_NOTICE : 运行是的消息信息

  • E_CORE_ERROR : 类似E_ERROR,但是不包括php核心错误

  • E_CORE_WARNING : 类似E_WARNING,但是不包括php核心警告

  • E_COMPILE_ERROR : 致命编译错误

  • E_COMPILE_WARNING : 致命编译警告

  • E_USER_ERROR : 用户导致的错误

  • E_USER_WARNING : 用户导致的警告

  • E_USER_NOTICE : 用户导致的消息

  • E_ALL : 所有的错误、消息和消息。

  • E_SCRIPT : 关于php版本移植的兼容性和操作性建议

  如果程序在开发过程中想看到php错误消息,要在php.ini文件中将display_errors配置项设置成on(注意在程序上线运行时,一定要将display_errors关掉,否则容易泄漏有关服务器的信息,为进一步攻击造成铺垫)。我们还可以定义php报告错误的级别,具体在error_reporting配置项。

<html>
    <head>
        <title>php错误和异常</title>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    </head>
    <body>
        <?php 
            echo ini_get("log_errors") . "<br />";
            echo ini_get("display_errors") . "<br />";
            ini_set("display_errors", 1); //打开php的错误输出(正式环境要关闭)
            error_reporting(E_ALL&~(E_WARNING | E_NOTICE));//设置php输出错误的级别,输入非E_WARNING和E_NOTICE级别的错误
            gettype($name);//调用没有定义的变量
            gettype();//调用函数时,没有指定必须的参数
            getName();//调用没有定义的函数   
        ?>
    </body>
</html>

如上面代码就会输入getName()这一行代码抛出的错误信息:

1
1

( ! ) Fatal error: Call to undefined function getName() in /home/youthflies/work/workspace/php/test/test3.php on line 15Call Stack#TimeMemoryFunctionLocation10.0268126916{main}( )../test3.php:0

 

 

我们还可以自定义错误处理函数,这样我们就可以随时记录错误信息、屏蔽错误输出(防止黑客攻击)、指定友好的错误页面。一般使用set_error_handler()函数来手工指定错误处理函数。

<?php
    //为了网站安全,一定要屏蔽掉一切的错误输出
    error_reporting(0);
                               
    /**
     * 自定义Error_Handler函数,作为set_error_handler()函数的回调函数,该函数必须有四个参数
     * @param   int $error_level    错误级别
     * @param   string  $error_message  错误消息
     * @param   string  $file   发生错误的文件
     * @param   int $line   发生错误的行数
     */
    function error_handler($error_level, $error_message, $file, $line)
    {
        $EXIT = FALSE;
        switch ($error_level)
        {
            //错误级别
            case E_ERROR:
            case E_USER_ERROR:
                $error_type = "Fatal Error";
                $EXIT = true;
                break;
                                           
            //提醒级别
            case E_NOTICE:
            case E_USER_NOTICE:
                $error_type = "Notice";
                break;
                                           
            //警告级别
            case E_WARNING:
            case E_USER_WARNING:
                $error_type = " Warning";
                break;
                                           
            //其他未知错误
            default:
                $error_type = "Unknown";
                $EXIT = true;
                break;
        }
        //直接打印输出错误信息,但是为了安全,一般是写入文件,或者数据库
        printf("<font clolr='#FF0000'><b>%s</b></font>:%s in <b>%s</b> on line <b> %d </b><br>n", $error_type, $error_message, $file, $line);
        if($EXIT == true)
            echo '<script>location="error.html"</script>';
    }
    //设置错误处理函数
    set_error_handler('error_handler');
                               
    //报未定义的变量notice
    echo $name;
    //报除0警告
    echo 10/0;
    //手动抛出错误
    trigger_error('致命错误', E_USER_ERROR);
?>

通过更改php.ini配置文件,我们可以将错误信息输出到指定文件中:

error_reporting = E_ALL ;抛出每一个错误、警告

display_errors = Off ; 关闭错误展示

log_errors = On ;决定日志语句记录的位置

log_errors_max_len = 1024 ;每个日志项的最大长度

error_log = /home/yourname/work/error.log ; 指定错误日志文件

修改完毕后,重启Web服务器,即可生效。然后再运行含有错误的php代码,错误信息就会被写入到error.log中。

我们还可以自定义错误信息,error_log()函数允许我们自定义错误。

error_log("This is an error", 3, "/home/yourname/work/error.log");

第一个参数是错误内容,第二个参数指定错误信息的输出位置,如果留空,就默认php.ini指定的位置,0表示操作系统日志,1表示使用php mail()函数发送出去,2表示将错误消息发送到tcp(此时第三个参数表示目标IP及端口),3表示存到本机文件中。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

(Spamcheck Enabled)