error_reporting 是 php 错误级别开关,控制错误“显示”和“记录”的过滤阈值;默认全记日志,但仅高危级别(如 e_error、e_parse)显示在页面上,需配合 display_errors 和 log_errors 才生效。

error_reporting 是 PHP 的错误级别开关
它不决定“是否报错”,而是决定“报哪些错”。PHP 默认会把所有错误都记进日志,但只把部分级别(比如 E_ERROR、E_PARSE)显示在页面上——error_reporting 控制的就是这个“显示”和“记录”的过滤阈值。
常见配置值怎么选
开发环境别用 error_reporting(0),那等于把警告当空气;线上环境又不能开 E_ALL,否则用户可能看到敏感路径或变量名。实际选法看场景:
-
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED):开发常用,忽略无关紧要的提示和过时警告,保留真正可能出问题的错误 -
error_reporting(E_ALL):本地调试时开,能提前发现拼写错误(比如$usernmae)、未定义变量等 -
error_reporting(E_ERROR | E_WARNING | E_PARSE):线上最小可用组合,避免暴露E_NOTICE级别的细节,但又不至于漏掉运行时异常
ini_set('error_reporting', ...) 和 php.ini 设置的区别
两者都能改,但生效时机和范围不同:
基于ECSHOP2.7.2制作,模板使用的是早期的凡客模板。整站大气,清爽。适合综合,鞋子,服饰类商城使用。具体安装方法在程序包中有说明,在使用之前请看下。 大体方法:1.上传程序至网站根目录,访问:域名/diguo (用户名:admin 密码:123456)2.设置好数据库信息,然后恢复数据,数据目录在www.shopex5.com下.3.修改data目录下的config数据库配置文件。4.登陆
- 在脚本开头用
ini_set('error_reporting', E_ALL),只影响当前请求,且必须在任何错误发生前调用(比如放在echo $undefined_var;前面才有效) - 在
php.ini里设error_reporting = E_ALL,是全局默认,所有脚本启动时就生效,但会被运行时的ini_set覆盖 - 如果用了
display_errors = Off,哪怕error_reporting开得再大,页面也不会输出错误,只会记日志——这点常被忽略,导致以为配置没生效
为什么 set_error_handler 有时不接管所有错误
set_error_handler 只能捕获 E_ERROR 以下级别的错误(如 E_WARNING、E_NOTICE),而 E_ERROR、E_PARSE、E_CORE_ERROR 这类致命错误无法被接管,会直接中断脚本。这时候 error_reporting 的值会影响“是否触发 handler”:
立即学习“PHP免费学习笔记(深入)”;
- 如果
error_reporting关掉了E_WARNING,那即使写了set_error_handler,也收不到警告 - 想统一处理,得先确保
error_reporting包含对应级别,再配合set_error_handler+register_shutdown_function捕获致命错误的残留信息
最易被忽略的是:错误是否显示,取决于 display_errors 和 error_reporting 两个开关同时为真;而是否记录,则还受 log_errors 和 error_log 配置影响。三者不联动,得一个个对。










