PHP错误默认不显示,需手动开启调试模式;线上环境必须关闭display_errors以防泄露敏感信息;php.ini中需同时设置display_errors=On、error_reporting=E_ALL、log_errors=On,并重启Web服务生效。

PHP 错误默认不显示,必须手动开启调试模式才能看到真实错误信息;线上环境务必关闭,否则会暴露敏感路径和代码逻辑。
如何在 php.ini 中全局开启错误显示
修改 php.ini 是最彻底的方式,适用于 CLI 和 Web 环境。关键配置项有三个,缺一不可:
-
display_errors = On:控制是否把错误输出到页面或终端 -
error_reporting = E_ALL:设定报告哪些错误级别(推荐用E_ALL,包含E_DEPRECATED和E_STRICT) -
log_errors = On:确保错误同时写入日志文件(配合error_log指定路径)
改完后必须重启 Web 服务(如 sudo systemctl restart apache2 或 sudo service php-fpm restart),否则不生效。
如何在 PHP 脚本中临时开启错误显示
适合开发调试、无法修改 php.ini 的场景,但仅对当前脚本生效:
立即学习“PHP免费学习笔记(深入)”;
error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
注意:display_startup_errors 必须显式开启,否则像 undefined function 这类解析期错误仍不会显示。
常见误区:只写 error_reporting(E_ALL) 就以为能看见错误——其实没开 display_errors,错误仍被静默吞掉。
为什么开了 display_errors 却还是看不到错误?
典型原因有四个:
- Web 服务器(如 Nginx)配置了
fastcgi_intercept_errors on,会拦截并替换 PHP 错误页 → 改为off或注释掉 - PHP 脚本开头用了
@抑制符(如@file_get_contents(...)),错误被完全屏蔽 - 框架(如 Laravel、ThinkPHP)自带异常处理器,覆盖了原生错误输出 → 查看框架文档启用 debug 模式(如设置
APP_DEBUG=true) -
浏览器缓存了 500 响应页,实际错误已变但页面没刷新 → 强制清空缓存或用
curl -I查看响应头
线上环境怎么安全地查错误?
绝不能开 display_errors,但可以做到可追溯:
- 确保
log_errors = On且error_log = /var/log/php_errors.log(路径需 PHP 进程有写权限) - 用
tail -f /var/log/php_errors.log实时监控 - 配合
error_log()函数在关键位置打点,例如:error_log("user_id={$uid} failed to save", 3, "/var/log/myapp.log"); - 若用 Docker,记得挂载日志目录并确认容器内 PHP 用户(如
www-data)对日志路径有写权限
最常被忽略的一点:error_log 文件权限不对或磁盘满,会导致错误日志“看似没生成”,其实根本没写进去。











