PHP 错误处理机制
PHP 错误处理机制
做开发离不开错误处理,搞懂 PHP 的错误机制才能写出健壮的代码。
1. 错误级别
PHP 错误分几个级别:
1)致命错误(E_ERROR)
- 脚本停止执行
- 比如调用不存在的类、方法
2)警告(E_WARNING)
- 脚本继续执行
- 比如包含不存在的文件
3)注意(E_NOTICE)
- 不影响执行
- 比如使用未定义的变量
2. 错误报告配置
php.ini 里的配置:
; 开发环境:显示所有错误
display_errors = On
error_reporting = E_ALL
; 生产环境:不显示错误,记录日志
display_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_NOTICE
3. 自定义错误处理
// 设置错误报告级别
error_reporting(E_ALL);
// 自定义错误处理函数
set_error_handler(function($errno, $errstr, $errfile, $errline) {
echo "错误:[$errno] $errstr 在 $errfile 第 $errline 行";
return true; // 阻止默认错误处理
});
// 测试
echo $undefined_var;
4. 异常处理
try {
if (!file_exists("test.txt")) {
throw new Exception("文件不存在");
}
$file = fopen("test.txt", "r");
} catch (Exception $e) {
echo "错误:" . $e->getMessage();
} finally {
echo "\n执行完成";
}
5. 错误日志
// 记录错误日志
error_log("这是一条错误日志", 3, "/tmp/php_errors.log");
// 手动触发错误
trigger_error("自定义错误", E_USER_WARNING);
6. 开发 vs 生产
开发环境:
- 显示错误
- 所有错误都报告
- 方便调试
生产环境:
- 不显示错误(防止泄露敏感信息)
- 记录错误日志
- 只报告致命错误和警告
7. 常用技巧
1)错误抑制符 @
// 不推荐,会影响性能
@include("config.php");
2)die/exit
// 简单粗暴
if (! $db) {
die("数据库连接失败");
}
3)抛异常
- 推荐用异常处理
- 代码更清晰,容易维护
总结
PHP 错误处理要点:
- 开发环境显示错误,生产环境记录日志
- 用 try-catch 处理异常
- 错误日志要记录,方便排查
- 不要用 @ 错误抑制符
写代码多做错误处理,线上少踩坑。
PHP 错误处理最佳实践
PHP 错误处理最佳实践
错误处理是 PHP 开发最容易忽略但最重要的环节,写好了排查问题事半功倍,写不好线上出问题抓瞎。
1. 错误级别
PHP 有不同的错误级别:
- E_ERROR:致命错误,脚本停止
- E_WARNING:警告,脚本继续
- E_NOTICE:注意,一般是不规范写法
- E_PARSE:语法解析错误
// 开发环境显示所有错误
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 生产环境不显示错误,只记日志
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/var/log/php/error.log');
2. 错误 vs 异常
PHP 里错误和异常是两回事:
- 错误:语法错误、内存不足这种,用 try/catch 抓不住
- 异常:业务层面的错误,比如数据库连接失败
PHP 7+ 大部分错误会抛 Error 异常,也可以抓了。
3. try/catch 用法
try {
// 可能出错的代码
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
} catch (PDOException $e) {
// 捕获异常
echo "数据库连接失败:" . $e->getMessage();
// 记日志
error_log("DB Error: " . $e->getMessage());
}
4. 自定义错误处理
// 设置自定义错误处理器
set_error_handler(function($errno, $errstr, $errfile, $errline) {
// 把错误转成异常抛出
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
// 设置异常处理器
set_exception_handler(function($e) {
// 所有未捕获的异常都到这里
error_log("Uncaught: " . $e->getMessage());
echo "系统繁忙,请稍后再试";
});
// 注册关闭函数,抓致命错误
register_shutdown_function(function() {
$error = error_get_last();
if ($error && in_array($error['type'], [E_ERROR, E_PARSE])) {
error_log("Fatal: " . $error['message']);
}
});
5. 开发 vs 生产环境
开发环境:
- 打开 display_errors,错误直接显示在页面
- 打开所有错误级别
- 详细的报错信息方便调试
生产环境:
- 关闭 display_errors,不要把错误暴露给用户
- 错误全部写到日志文件
- 页面显示友好的"系统错误"提示
6. 常用错误处理技巧
// 1. 用 @ 抑制错误不好,应该判断
// 不好:
$file = @file_get_contents('config.php');
// 好:
$file = file_exists('config.php') ? file_get_contents('config.php') : null;
// 2. 不要把数据库错误信息直接返回给前端
// 不好:
echo $e->getMessage();
// 好:
error_log($e->getMessage());
echo json(['code' => 500, 'msg' => '系统错误']);
// 3. 日志要分级
error_log('信息:用户登录', 3, '/var/log/info.log');
error_log('警告:登录失败次数过多', 3, '/var/log/warn.log');
error_log('错误:数据库连接失败', 3, '/var/log/error.log');
7. 总结
PHP 错误处理核心:
- 开发环境显示错误,生产环境只记日志
- try/catch 捕获业务异常
- set_exception_handler 兜底
- 不要把错误细节暴露给用户
- 日志分级,方便排查
搞懂这些,线上出问题排查效率翻倍。