PHP错误处理留档

来源:互联网 发布:淘宝双11营业额直播 编辑:程序博客网 时间:2024/06/06 15:15

以前学的php错误处理

常见的错误级别
最低级别 deprecated
通知级别 notic
警告级别 warning(以上级别,程序还能继续往下运行)
最高级别 fatal errorparse error(语法检测阶段)
E_USER_相关错误

配置文件中和错误相关选项

选项 描述 error_reporting 错误级别设置 display_errors 是否显示错误 log_errors 是否保存错误信息到日志中 error_log 设置日志文件路径 ignore_repeared_errors 是否忽略重复错误信息 ignore_repeared_source 是否忽略重复错误信息的来源



开启配置错误选项

1.php.ini 配置 参数error_reporting配置错误级别和参数display_errors配置是否开启

error_reporting = E_ALL&~E_NOTICE等display_errors = On/off

2.动态配置 通过error_reporting()函数或ini_set()函数

error_reporting();//获取当前错误级别的位掩码error_reporting(E_ALL);//显示所有错误级别error_reporting(-1);//显示所有错误级别error_reporting(0);//屏蔽所有错误,但是不能屏蔽解析错误(parse error)ini_set('error_reporting',0);//屏蔽所有错误,但是不能屏蔽解析错误(parse error)ini_set('error_reporting',-1);//显示所有错误级别ing_set('display_errors',0);//关闭错误

3. 错误抑制符@ 屏蔽错误信息

@settype($a,'baicai');//这行代码的错误就不会显示了


手动抛出错误
触发错误功能不只限于PHP解析器,还可以通过trigger_error()函数触发错误
$num1 = 'a';$num2 = 1;if( !(is_numeric($char)&&is_numeric($int)) ){    echo trigger_error('num1和num2必须为合法数字',E_USER_NOTICE);    //echo trigger_error('num1和num2必须为合法数字',E_USER_WARNING);    //echo trigger_error('num1和num2必须为合法数字',E_USER_ERROR);}else{    echo $num1+$num2;}

错误日志选项

1.将日志保存到指定的文件中

   改php.ini文件相关的参数

log_errors = Onerror_log = 路径

测试

ini_set('display_errors','off');//关闭错误显示error_reporting(-1);开启所有错误级别echo $test;settype($a,'baicai');test();

   动态配置

ini_set('display_errors','off');//关闭错误显示ini_set('log_errors', 1);//开启错误日志ini_set('error_log','c:\errors\testError.log');//配置错误日志路径//测试error_reporting(-1);开启所有错误级别echo $test;settype($a,'baicai');test();

一个小例子 跟踪用户登录操作

ini_set('display_errors',0);ini_set('dete.timezone',PRC);error_reporting(-1);ini_set('log_errors', 1);ini_set('error_log','./testError.log');ini_set('ignore_repeated_errors','on');ini_set('ignore_repeated_source','on');$username = $_POST['username'];$password = $_POST['password']; if($username=='baicai'&&$password=='baicai'){    echo "登录成功"; }else{    $date = date('Y-m-d H:i:s');    $ip = $_SERVER['REMOTE_ADDR'];    $message= "用户{$username}在{$date}以密码{$password}尝试登录系统,IP地址为{$ip}";    error_log($message);//发送错误信息到的上面指定的文件中    echo "error"; }



2.将日志保存到系统日志中

ini_set('display_errors',0);ini_set('log_errors', 1);ini_set('error_log','syslog');//设置保存到系统日志//测试error_reporting(-1);开启所有错误级别echo $test;settype($a,'baicai');test();
ini_set('display_errors',0);ini_set('log_errors', 1);ini_set('error_log','syslog');//设置保存到系统日志error_reporting(-1);开启所有错误级别//手动发送信息到系统日志openlog('PHP5.5.12',LOG_PID,LOG_SYSLOG);syslog(LOG_ERR, 'THIS IS A TEST OF SYSLOG'.date('Y-m-d H:i:s'));closelog();



3.将错误信息发送到邮件(需要配置 用mail函数或者配置文件 然后结合seadmail 或者通过开源的邮件类库发送,像PHP Mailer或者SwiftMailer)

error_log('发送信息到邮箱',1,'baicai@baicai.com');

自定义错误处理

1.set_error_handler() 设置一个用户定义错误处理函数 接管php错误的处理,按照我们的需求自定义我们的错误处理形式

注释:如果使用该函数,会绕过标准 PHP 错误处理程序,同时如果必要,用户定义错误程序通过 die() 终止脚本。

注释:如果错误发生在脚本执行之前(比如文件上传时),将不会调用自定义的错误处理程序因为它尚未在那时注册。

如果函数返回 FALSE ,标准错误处理程序将会继续调用。

步骤:
1.创建错误处理函数
2.设置不同级别调用函数
3.set_error_handler()函数指定接管错误处理

error_reporting(-1);function customeError($errno,$errormsg,$file,$line){    echo "错误代码:[{$errno}] {$errormsg}<br/>".PHP_EOL;    echo "错误行号:{$file}文件中的第{$line}行<br/>".PHP_EOL;    echo "PHP版本:".PHP_VERSION."(".PHP_OS.")<br/>".PHP_EOL;}set_error_handler('customeError');echo $test;

结果

错误代码:[2] settype(): Invalid type

错误行号:H:\php\error.php文件中的第39行

PHP版本:5.5.12(WINNT)

错误代码:[8] Undefined variable: test

错误行号:H:php\error.php文件中的第40行

PHP版本:5.5.12(WINNT)

如果不用自定义错误处理 走标准错误处理程序

error_reporting(-1);/** * [customeError 函数] * @param  [int] $errno    [错误号] * @param  [string] $errormsg [错误信息] * @param  [string] $file     [错误文件] * @param  [int] $line     [错误行号] * @return void */function customeError($errno,$errormsg,$file,$line){    echo "错误代码:[{$errno}] {$errormsg}<br/>".PHP_EOL;    echo "错误行号:{$file}文件中的第{$line}行<br/>".PHP_EOL;    echo "PHP版本:".PHP_VERSION."(".PHP_OS.")<br/>".PHP_EOL;}//set_error_handler('customeError');echo $test;

结果

Warning: settype(): Invalid type in H:\php\error.php on line 39
Call Stack:
0.0002 234448 1. {main}() H:\php\error.php:0
0.0002 235024 2. settype() H:\php\error.php:39

Notice: Undefined variable: test in H:\php\error.php on line 40 Call
Stack:
0.0002 234448 1. {main}() H:\php\error.php:0

2.restroe_error_handle() 回收自定义错误处理函数。
3.register_shtudown_function() 在发生错误时,会调用注册的函数,给一次机会(回光返照的意思),来处理一些东西。

原创粉丝点击