PHP的错误处理和日志记录
PHP的错误处理和日志记录是保障应用稳定性的核心机制。下面从错误类型、处理方式和日志记录三方面详细说明:
一、错误类型
PHP错误分为四个级别:
- 致命错误 (
E_ERROR)
脚本立即终止,例如调用未定义函数:undefined_function(); // 触发 E_ERROR - 警告 (
E_WARNING)
脚本继续执行,例如包含缺失文件:include("missing_file.php"); // 触发 E_WARNING - 通知 (
E_NOTICE)
非关键提示,例如访问未定义变量:echo $undefinedVar; // 触发 E_NOTICE - 语法错误 (
E_PARSE)
脚本无法执行,例如缺少分号:$a = 1 // 缺少分号,触发 E_PARSE
二、错误处理机制
- 基础配置
在php.ini中设置:display_errors = Off ; 禁止页面显示错误 log_errors = On ; 启用错误日志 error_log = /path/to/php_errors.log ; 指定日志路径 - 运行时控制
通过代码动态调整:error_reporting(E_ALL); // 报告所有错误 ini_set('display_errors', 0); // 关闭页面错误显示 - 自定义错误处理器
使用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");
三、日志记录实践
- 系统日志函数
// 记录到文件 error_log("Login failed: user=admin", 3, "/var/log/auth.log"); // 发送到邮件(需配置SMTP) error_log("DB connection failed", 1, "admin@example.com"); - 异常处理
结合try/catch记录异常:try { $pdo = new PDO("mysql:host=invalid;dbname=test", "user", "pass"); } catch (PDOException $e) { error_log("PDO Exception: " . $e->getMessage()); } - 框架集成
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%
261

被折叠的 条评论
为什么被折叠?



