PHP的错误处理和日志记录

PHP的错误处理和日志记录

PHP的错误处理和日志记录是保障应用稳定性的核心机制。下面从错误类型、处理方式和日志记录三方面详细说明:

一、错误类型

PHP错误分为四个级别:

  1. 致命错误 (E_ERROR)
    脚本立即终止,例如调用未定义函数:
    undefined_function(); // 触发 E_ERROR
    

  2. 警告 (E_WARNING)
    脚本继续执行,例如包含缺失文件:
    include("missing_file.php"); // 触发 E_WARNING
    

  3. 通知 (E_NOTICE)
    非关键提示,例如访问未定义变量:
    echo $undefinedVar; // 触发 E_NOTICE
    

  4. 语法错误 (E_PARSE)
    脚本无法执行,例如缺少分号:
    $a = 1 // 缺少分号,触发 E_PARSE
    

二、错误处理机制
  1. 基础配置
    php.ini 中设置:
    display_errors = Off      ; 禁止页面显示错误
    log_errors = On           ; 启用错误日志
    error_log = /path/to/php_errors.log ; 指定日志路径
    

  2. 运行时控制
    通过代码动态调整:
    error_reporting(E_ALL);               // 报告所有错误
    ini_set('display_errors', 0);          // 关闭页面错误显示
    

  3. 自定义错误处理器
    使用 set_error_handler() 捕获非致命错误:
    function customErrorHandler($errno, $errstr, $errfile, $errline) {
        $log = "[$errno] $errstr in $errfile on line $errline";
        error_log($log);  // 写入系统日志
        return true;      // 阻止默认错误处理
    }
    set_error_handler("customErrorHandler");
    

三、日志记录实践
  1. 系统日志函数
    // 记录到文件
    error_log("Login failed: user=admin", 3, "/var/log/auth.log");
    
    // 发送到邮件(需配置SMTP)
    error_log("DB connection failed", 1, "admin@example.com");
    

  2. 异常处理
    结合 try/catch 记录异常:
    try {
        $pdo = new PDO("mysql:host=invalid;dbname=test", "user", "pass");
    } catch (PDOException $e) {
        error_log("PDO Exception: " . $e->getMessage());
    }
    

  3. 框架集成
    Laravel等框架的日志组件:
    use Illuminate\Support\Facades\Log;
    Log::error("Payment processing failed", ['order_id' => 1001]);
    

最佳实践建议
  • 生产环境始终关闭 display_errors
  • 对致命错误使用 register_shutdown_function() 捕获
  • 定期轮转日志文件防止过大
  • 敏感信息过滤(如密码)后再记录

关键公式:错误捕获覆盖率计算
设 $E_t$ 为总错误数,$E_c$ 为捕获错误数,则覆盖率
$$ \text{Coverage} = \frac{E_c}{E_t} \times 100% $$
建议覆盖率 ≥95%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值