本文目录导读:

在 PHP 中,错误日志级别的设置主要通过 error_reporting 指令来控制,这个指令决定了 PHP 会记录(或显示)哪些级别的错误。
以下是设置错误日志级别的详细方法、常用级别以及最佳实践。
核心设置方法
修改 php.ini 文件(全局生效,推荐)
这是最常用的生产环境配置方式,找到 php.ini 文件(可通过 php --ini 命令查看路径),修改以下内容:
; 设置错误报告级别(建议生产环境使用) error_reporting = E_ALL ; 是否显示错误到屏幕(生产环境建议关闭) display_errors = Off ; 是否记录错误到日志文件(生产环境建议开启) log_errors = On ; 指定错误日志文件路径(确保目录可写) error_log = /var/log/php_errors.log
修改后需要重启 PHP-FPM 或 Web 服务器(Apache/Nginx)。
使用 ini_set() 函数(脚本内局部生效)
在 PHP 代码中动态设置,只对当前脚本生效,优先级高于 php.ini。
<?php
// 开启所有错误报告
ini_set('error_reporting', E_ALL);
// 或者只报告警告和致命错误
ini_set('error_reporting', E_WARNING | E_PARSE | E_ERROR);
// 开启日志记录
ini_set('log_errors', 1);
ini_set('error_log', '/path/to/your/custom.log');
// ... 你的代码
使用 Apache .htaccess 文件(Apache 虚拟主机局部生效)
如果使用 Apache 且允许 .htaccess,可以在站点根目录创建 .htaccess 文件:
php_value error_reporting E_ALL php_flag display_errors Off php_flag log_errors On php_value error_log /path/to/your/log/error.log
使用 error_reporting() 函数(代码内实时切换)
在你代码的特定位置,可以使用 error_reporting(E_ALL) 来切换级别,开发调试时开启全量,上线前禁用。
常用错误级别常量(位掩码)
PHP 使用位运算符()组合多个级别,以下是最常使用的常量:
| 常量 | 数值 | 描述 | 建议 |
|---|---|---|---|
| E_ALL | 32767 | 所有错误和警告(自 PHP 5.4 起包含 E_STRICT) | 推荐 |
| E_ERROR | 1 | 致命运行时错误(脚本终止) | 必报告 |
| E_WARNING | 2 | 非致命的运行时警告(脚本继续运行) | 必报告 |
| E_PARSE | 4 | 编译时语法解析错误 | 必报告 |
| E_NOTICE | 8 | 运行时通知(未初始化变量等) | 可忽略 |
| E_STRICT | 2048 | 启用 PHP 对代码可移植性的建议 | 建议开发用 |
| E_DEPRECATED | 8192 | 包含已弃用函数的警告 | 建议开发用 |
| E_USER_ERROR | 256 | 用户生成的错误(trigger_error) | 按需 |
| E_USER_WARNING | 512 | 用户生成的警告 | 按需 |
| E_USER_NOTICE | 1024 | 用户生成的通知 | 按需 |
场景化配置示例
生产环境(严格、隐藏错误)
目标:不向用户显示任何错误,但记录所有严重错误到日志。
; php.ini error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE display_errors = Off log_errors = On error_log = /var/log/php_errors.log
E_ALL & ~E_DEPRECATED & ~E_NOTICE:报告所有错误,但排除弃用警告和通知(减少日志噪音)。
开发环境(全量、直接显示)
目标:在屏幕上直接看到所有问题,方便调试。
<?php
// 脚本顶部
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('log_errors', 0); // 或 1
检测当前设置
<?php
echo "当前错误级别:";
echo error_reporting(); // 输出数字(如 32767)
echo "<br>";
var_dump(ini_get('display_errors'));
var_dump(ini_get('log_errors'));
var_dump(ini_get('error_log'));
最佳实战建议
E_ALL是黄金标准:在开发阶段始终使用E_ALL,它可以捕获所有潜在问题。- 生产环境必须关闭
display_errors(设为 Off),避免泄露路径、数据库信息等敏感数据。 - 生产环境必须开启
log_errors,并确保日志文件路径有写权限。 - 不要用 抑制错误: 运算符会降低性能并隐藏问题,强烈不建议使用。
- 处理致命错误:可以注册
set_error_handler()和set_shutdown_function()来捕获E_ERROR级致命错误,记录到自定义错误日志系统中(如 Sentry)。
// 捕获致命错误
register_shutdown_function(function() {
$error = error_get_last();
if ($error !== null && in_array($error['type'], [E_ERROR, E_PARSE])) {
// 记录致命错误
error_log("Fatal: " . $error['message'] . " in " . $error['file'] . ":" . $error['line']);
}
});
特别注意:PHP 版本差异
自 PHP 8.0 起,许多 E_STRICT 错误已被移入其他级别,且 E_ALL 默认包含所有级别,在 PHP 8.x 中,直接使用 error_reporting(E_ALL) 即可覆盖所有新特性(如 TypeError)。