改了 display_errors = Off 没生效,主因是修改了错误的 php.ini 文件;需通过 phpinfo() 查“Loaded Configuration File”确认真实路径,并重启 Apache(Stop 再 Start),若用 PHP-FPM 还需检查 php-fpm.ini,同时排查 Apache 配置和代码中 error_reporting() 覆盖。

display_errors = Off 为什么改了没生效
常见现象是改完 php.ini 里的 display_errors = Off,重启 Apache 后页面还是照常报错。根本原因通常是:你改的不是当前 PHP 实际加载的配置文件。
验证方法很简单,在项目里加一行:<?php phpinfo(); ?>,打开页面后搜索 “Loaded Configuration File”,看到的路径才是真实生效的 php.ini。XAMPP 常见的有两个位置:C:\xampp\php\php.ini(主用)和 C:\xampp\apache\bin\php.ini(旧版或双配置残留),后者容易被误改但实际不生效。
改完必须重启 Apache(不是只点“Restart”按钮,建议在 XAMPP 控制面板里先 Stop 再 Start);如果用了 PHP-FPM 模式(XAMPP 8.0+ 默认),还得确认 php-fpm.ini 里没覆盖 display_errors。
error_reporting = 0 和 E_ALL & ~E_NOTICE 的区别
设成 error_reporting = 0 是彻底关闭所有错误报告,连 Parse error 都不显示——这会让语法错误直接导致白屏,调试极其困难。不推荐在开发环境用。
立即学习“PHP免费学习笔记(深入)”;
更实用的是按需过滤:
-
error_reporting = E_ALL & ~E_NOTICE:关掉Notice类提示(如未定义变量),保留Warning和Error -
error_reporting = E_ALL & ~E_DEPRECATED & ~E_USER_NOTICE:再屏蔽弃用警告和用户级 Notice -
error_reporting = E_ALL | E_STRICT:开发时全开,连编码风格问题都报(PHP 7.4+ 已合并进 E_ALL)
注意:如果 php.ini 里写了 error_reporting = E_ALL & ~E_NOTICE,但代码里又调了 error_reporting(0),后者会覆盖前者——运行时优先级更高。
log_errors = On 必须配 error_log 路径
只开 log_errors = On 不写 error_log,错误会默默丢进系统默认日志(Windows 下常是 C:\xampp\apache\logs\error.log,Linux/macOS 下可能是 /var/log/apache2/error.log),跟你预期的 PHP 专属日志不是一回事。
明确指定路径才可控:
- Windows:
error_log = "C:\xampp\apache\logs\php_error.log" - macOS/Linux:
error_log = /opt/lampp/logs/php_error.log
路径必须存在且 Apache 进程有写权限。XAMPP 默认用 daemon(macOS/Linux)或 SYSTEM(Windows)账户跑 Apache,别设到需要管理员权限的目录(比如 C:\ 根目录)。
Apache 配置里 php_value 会覆盖 php.ini
如果你在 httpd.conf 或虚拟主机配置里写了 php_value error_reporting 30719(即 E_ALL 十进制值),它会强制覆盖 php.ini 里的设置,哪怕你把 php.ini 改成 0 也没用。
排查方式:在 phpinfo() 页面搜 “error_reporting”,看 “Local Value” 和 “Master Value” 是否一致。不一致就说明被 Apache 配置劫持了。
临时禁用方法:在对应 <Directory> 或 <VirtualHost> 块里加 php_flag display_errors off,比改全局更安全。
真正难搞的不是改哪行,而是得同时盯住四个地方:实际加载的 php.ini、php-fpm.ini(如有)、Apache 主配置、以及项目代码里的 ini_set() 或 error_reporting() 调用——漏一个,配置就白调。



















