PHP页面暴露警告信息需关闭display_errors并开启log_errors记录,错误级别应按环境区分,header警告须修复输出顺序,@抑制符不可取,关键在返回值判断与日志埋点。

PHP页面暴露警告信息是因为开启了错误报告
默认情况下,display_errors 是开启的(尤其在开发环境),导致 E_WARNING、E_NOTICE 这类非致命错误直接输出到 HTML 页面里,破坏结构、泄露路径或变量名。
关键不是“隐藏”,而是“不显示但保留记录”——这才是生产环境该做的。
-
display_errors = Off(必须关,写在php.ini或用ini_set('display_errors', '0')) -
log_errors = On(确保错误写进日志,别丢) -
error_log = /var/log/php_errors.log(指定日志路径,注意 Web 服务用户有写权限)
用 ini_set() 临时关闭警告显示但不改全局配置
适合无法修改 php.ini 的共享主机,或只想对单个脚本生效。注意:它必须放在出错代码之前,且某些错误(如解析错误)根本走不到这行。
常见误用是放在 try/catch 里——没用,PHP 警告不是异常,catch 捕不到。
立即学习“PHP免费学习笔记(深入)”;
- 在文件最顶部加:
ini_set('display_errors', '0'); - 搭配设置错误级别:
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED); - 若用了
require或include,得在它们之前设,否则被包含文件的警告仍会显示
Warning: Cannot modify header information – headers already sent
这个警告本身是“结果”,不是原因。它说明你试图用 header()、session_start() 时,已有输出(空格、BOM、echo、甚至 PHP 关闭标签 ?> 后的换行)提前发出了 HTTP body。
它藏不住,也别想藏——必须修复输出顺序问题。
- 检查所有被引入文件(尤其是
config.php、functions.php)末尾有没有?>,删掉更安全 - 用编辑器显示隐藏字符,确认无 UTF-8 BOM(特别是 Windows 记事本保存的文件)
- 用
ob_start()开启输出缓冲可绕过,但只是掩耳盗铃;缓冲延迟发送头,掩盖了设计缺陷
开发和生产环境要严格区分 error_reporting 级别
开发时开全量(E_ALL),上线后只报致命错误(E_ERROR | E_PARSE),既不干扰用户,又不漏真正问题。
靠 .htaccess 或 nginx.conf 设置比 PHP 代码更可靠,因为不依赖执行流程:
- Apache:
php_flag display_errors off+php_value error_reporting 2(2 是E_ERROR) - Nginx:
fastcgi_param PHP_VALUE "display_errors=Off \n error_reporting=2"; - 别信
@符号——它抑制警告但拖慢性能,还让日志空白,排查时抓瞎
file_get_contents() 失败),它们不会报错,但会让页面逻辑断裂——这类问题,光藏警告没用,得靠返回值判断和日志埋点。











