PHP隐错后浏览器仍显示错误,说明display_errors未真正关闭,需检查php.ini实际生效值、运行时代码覆盖、框架调试模式、OPcache缓存及Web服务器参数覆盖。
PHP 隐错后浏览器仍显示错误信息,说明 display_errors 未真正关闭,或被运行时函数(如 ini_set())临时开启,也可能受 Web 服务器配置、框架层覆盖或 OPcache 缓存影响。
检查并强制关闭 display_errors 和 html_errors
仅在 php.ini 中设置不够——PHP CLI、FPM、Apache 模块可能加载不同配置文件。必须确认当前运行环境实际生效的值:
- 新建
info.php,写入,访问后搜索display_errors和html_errors,看其“Local Value”是否为Off - 若为
On,修改对应配置文件(常见路径:/etc/php/*/fpm/php.ini、/etc/php/*/apache2/php.ini或php --ini显示的路径) - 设为:
display_errors = Off,html_errors = Off(后者防止错误中嵌入 HTML 标签泄露路径) - 改完重启服务:
sudo systemctl restart php*-fpm或sudo systemctl restart apache2
排查运行时代码主动开启错误显示
很多老项目或调试代码会在入口处调用 ini_set('display_errors', '1') 或 error_reporting(E_ALL),这类设置优先级高于 php.ini:
- 全局搜索项目中所有
ini_set、error_reporting、set_error_handler调用 - 特别注意
index.php、bootstrap.php、config.php等启动文件 - 若有,改为:
ini_set('display_errors', '0');,并确保它在任何报错发生前执行 - 避免在条件分支里开启(如
if (DEBUG) { ini_set(...) }),上线时 DEBUG 常被遗漏
确认 error_log 是否启用且路径可写
关闭 display_errors 后,错误应写入日志而非屏幕。若日志没内容,可能是 error_log 未配或权限不足,导致错误被丢弃: