php错误级别配置
-
常见的错误级别
- 最低级别 deprecated
- 通知级别 notic
- 警告级别 warning(以上级别,程序还能继续往下运行)
- 最高级别 fatal error 和 parse 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 = On
error_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:39Notice: 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() 在发生错误时,会调用注册的函数,给一次机会(回光返照的意思),来处理一些东西。