快速定位PHP页面空白问题:在入口文件顶部添加error_reporting(E_ALL); ini_set('display_errors', '1'); ini_set('display_startup_errors', '1');并注意opcache缓存、配置文件路径、Web服务器重启及框架错误处理器干扰。

PHP 不报错但页面空白,怎么快速定位?
直接在入口文件(比如 index.php)顶部加这三行,绕过所有配置限制:
error_reporting(E_ALL);ini_set('display_errors', '1');ini_set('display_startup_errors', '1');
注意:如果用了 opcache,改完代码可能不生效——得清掉缓存或临时关掉 opcache.enable=0。线上环境别留着,本地调试完就删。
php.ini 里 display_errors=Off 但开发机还是不显示错误?
常见原因是 Web 服务器(如 Apache/Nginx)用的是系统级 php.ini,而 CLI 或 Docker 容器里跑的是另一份。先确认当前生效的配置位置:
- 写个
phpinfo();页面,搜Loaded Configuration File这一行 - 或者命令行运行
php --ini,看Configuration File路径 - 改对文件后,必须重启 PHP-FPM 或 Apache,
service php-fpm restart不等于 reload
有些云服务(如 Laravel Forge、Plesk)会覆盖 display_errors,得在站点级配置里单独开。
立即学习“PHP免费学习笔记(深入)”;
Warning: Cannot modify header information – headers already sent
这不是语法错误,是输出干扰了 HTTP 头发送。调试时最容易被忽略的“隐形输出”:
-
UTF-8 BOM:用 VS Code 或 Sublime 打开 PHP 文件,右下角看编码是否带BOM,有就转成UTF-8(无 BOM) - 文件末尾多了一个空行或空格,尤其在
?>后面 - 被 include 的配置文件(比如
config.php)开头有空格或注释前的空白
临时验证方法:在出错文件最开头加 var_dump(headers_sent());,返回 true 就说明头已发,再往上找输出源。
开发环境开了错误显示,但某些 Notice 还是不出现?
PHP 8.0+ 默认关闭了 E_NOTICE 和 E_DEPRECATED 的显示,即使 error_reporting 设为 E_ALL。原因很实际:老项目升级后满屏提示会掩盖真正问题。
- 显式补全:
error_reporting(E_ALL | E_NOTICE | E_DEPRECATED); - CLI 下调试命令行脚本,记得加
-d error_reporting=E_ALL参数,比如php -d error_reporting=E_ALL script.php - 如果用了 Xdebug,它自己的
xdebug.mode设置(如develop,debug)会影响错误捕获粒度,不单看 PHP 原生配置
最麻烦的情况是框架(如 Laravel、Symfony)自带错误处理器接管了 set_error_handler,这时候得查框架文档,看怎么把底层错误透传出来——不是改 php.ini 就能解决的。











