本文目录导读:

在 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)。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播