PHP错误与异常处理(一)

错误与异常的概念

PHP错误:是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查,甚至无法运行的情况。平时遇到的warming、notice都是错误,只是级别不同而已。

PHP异常:一般是业务逻辑上不合预期、与正常流程不同的状况,不是语法错误。
下面我们来看看PHP中的错误级别:

图片.png

图片.png

图片.png

图片.png


设置错误级别  
   一.错误级别可以在php.ini的error_reporting里设置,如果是想显示除了notice以外所有的错误级,则可以设置成:error_reporting=E_ALL&~E_NOTICE。其中,配置项里还有有个display_errors,如果把它设置为off,则页面上即使有错误,也不会显示出来。

二.当然,在我们的实际开发中,一般情况的话我们可以在php的程序中进行设置。例如在程序中输入error_reporting(0);就表示屏蔽所有错误,也就是所有的错误都不会再页面显示出来(不包括解析错误),error_reporting(-1);就表示显示所有错误。如果想显示除了notice以外所有的错误级,也可以在程序中做设置: error_reporting(E_ALL&~E_NOTICE)。
   三.我们也可以使用ini_set()来进行运行时设置配置选项的值。例如:ini_set(‘error_reporting’,0)来设置不开启所有的错误(不包括解析错误),ini_set(‘error_reporting’,-1)来设置开启所有的错误级别。如果设置ini_ser(‘display_errors’,0)来设置显示的话,不管错误级别进行了怎样的设置,都不会再页面上显示错误。


PHP配置文件中与错误日志相关的选项将错误日志存到指定文件中  

图片.png

   一、我们可以通过在php的配置文件中(php.ini)找到log_errors将其值设为on,进行开启。然后找到error_log,将错误日志指定到某个文件下。例如(E:/PHP/error/error.log)。 

   二、我们也可以在PHP程序中进行动态开启,代码如下:

<?php
ini_set('display_errors','off');//关闭错误显示,不让客户看到错误信息
ini_set('error_log','E:\php39\impover\error.log'); 
error_reporting(-1);//开启所有的错误级别 
echo $test;//输出没有值的数
echo '<hr />'; 
error();//调用未定义的函数 
?>

然后在指定的文件夹下会多了一个error.log的文件,点开,出现如下的信息:

图片.png  

   三、我们也可以把错误日志也存储到系统中,代码如下:

<?php 
/**
 * 把错误日志存储到系统中 
*/ 
ini_set('display_errors',0);
ini_set('log_errors',1);//开启错误日志 
ini_set('error_log','syslog');//把错误日志存储到系统中 
error();//调用一个不存在的函数,报错。 
?>

运行上面代码之后,我们鼠标右键计算机——》管理——》事件查看器——》信息,找到PHP-5.6.30(如果使用的php版本不是这个,就会显示相应的php版本),查看结果。


下面写一个事例,用在某些人进行各种尝试以能够登录admin
HTML的代码如下:

<!DOCTYPE html>
<html>
    <head>
      <meta charset="utf-8">
    </head>
    <body>
    <h1>登录系统</h1>
    <form action="doAction.php" method="post">
        用户名:<input type="text" name="username" /><br />
        密码:<input type="password" name="password" /><br />
        <input type="submit" value="提交" />
    </form>
    </body>
</html>

PHP的代码如下:


<?php
/**
 
* 记录错误信息,检查是否有人进行各种尝试进行admin信息的登录
 */ 
ini_set('diaplay_errors',1);//显示所有的错误信息 
error_reporting(-1);//开启所有的错误级别 
ini_set('log_errors','on');//开启错误日志 
ini_set('error_log','E:\php39\impover\adminLogin.log');//错误日志文件地址 
ini_set('ignore_repeated_errors','on');//忽略重复的错误信息 
ini_set('ignore_repeated_source','on');//忽略重复错误信息的来源 
$username = $_POST['username']; 
$password = $_POST['password']; 
if($username=='admin'&& $password=='root'){
    echo 'ok';
}else{
    $date = date('Y-m-d H:i:s',time());
    $ip = $_SERVER['REMOTE_ADDR'];//获取ip
    $message = "用户{$username}在{$date}以密码{$password}尝试登录系统,IP为{$ip}";
    error_log($message);//写入错误信息
    header('Location:test.html');
}
?>

尝试2次故意的错误登录之后,错误日志如下:

图片.png

头像
QQ登录: