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 兜底
  • 不要把错误细节暴露给用户
  • 日志分级,方便排查

搞懂这些,线上出问题排查效率翻倍。


emer 发布于  2026-10-6 07:37