PHP 页面白屏且不报错,通常不是代码没错误,而是错误被“藏”起来了:要么 PHP 的 display_errors 关闭,要么 error_reporting 级别太低,要么错误被输出缓冲、自定义错误处理器或框架的异常处理吞掉。想看到错误,先让 PHP 把错误显示到页面上,再排查是谁把错误截走了。最直接的动作是临时在入口文件顶部打开 display_errors 并调高 error_reporting,同时确认没有输出缓冲干扰;如果仍然白屏,就去检查 error_log 和框架的日志目录。
白屏不报错时,优先怀疑错误显示被关闭或错误被拦截。临时开启 display_errors=On 和 error_reporting=E_ALL 能快速暴露语法错误、运行时警告和致命错误;但生产环境不要长期开启,应改为写日志。若开启后仍无输出,检查 output_buffering、自定义错误处理器、auto_prepend_file 以及框架的异常捕获逻辑。
先确认错误到底有没有被显示
在 PHP 里,错误是否显示由两个配置共同决定:display_errors 控制是否把错误信息输出到页面,error_reporting 控制哪些级别的错误被报告。很多环境默认 display_errors=Off,或者 error_reporting 只保留 E_ALL & ~E_DEPRECATED & ~E_STRICT 之类的组合,导致致命错误之外的提示被过滤。白屏最常见的原因是脚本发生致命错误(如调用未定义函数、语法错误),而 display_errors 关闭时页面就是空白。
临时排查时,可以在入口文件(如 index.php)最顶部加入以下代码,确保错误直接显示:
<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
注意这段代码必须放在文件最前面,且在 <?php 之后、任何业务逻辑之前执行。如果脚本本身有语法错误,这段代码也不会执行,此时需要检查 PHP 错误日志或使用命令行 php -l 检查语法。
检查输出缓冲和错误处理器是否吞掉了错误
即使打开了 display_errors,错误仍可能被以下机制拦截:
- 输出缓冲(output_buffering):当
output_buffering开启时,错误信息可能被缓冲,若脚本在刷新缓冲前终止,页面可能空白。可以尝试在入口文件调用ob_end_flush()或设置ini_set('output_buffering', '0')临时关闭。 - 自定义错误处理器:
set_error_handler或set_exception_handler可能把错误记录到日志而不输出。检查代码中是否有这类注册,或框架是否接管了错误处理。 - auto_prepend_file:如果
auto_prepend_file配置了某个文件,该文件可能修改了错误显示设置。查看phpinfo()中的auto_prepend_file值。 - 框架的异常捕获:Laravel、Symfony 等框架默认将异常转为日志和错误页面,调试模式关闭时可能只返回空白响应。检查框架的
APP_DEBUG环境变量或调试配置。
可以临时在入口文件最前面加上 var_dump(ini_get('display_errors'), ini_get('error_reporting')); 来确认实际生效的值,避免只改了 php.ini 但被运行时覆盖。
用日志兜底,不要只依赖页面输出
页面显示错误适合本地排查,但在预发布或生产环境,更可靠的方式是让错误写入日志。确保 log_errors=On 并设置 error_log 路径,然后查看 PHP 错误日志。常见位置包括 /var/log/php_errors.log、/var/log/php-fpm/error.log 或项目目录下的 error_log。如果使用 PHP-FPM,还要检查 php-fpm.conf 中的 catch_workers_output 和 php_admin_value[error_log] 设置。Web 服务器(Nginx/Apache)的错误日志也可能记录 PHP 崩溃信息,例如 /var/log/nginx/error.log。
一个实用的顺序是:先看 Web 服务器错误日志,再看 PHP 错误日志,最后才在页面临时打开 display_errors。如果日志里也没有任何记录,说明错误可能发生在 PHP 解析之前(如权限问题、文件不存在),或者错误被完全静默。
临时开启后记得恢复
在页面上显示错误会暴露文件路径、数据库连接信息等敏感内容,排查完成后应关闭 display_errors,改用日志记录。如果使用框架,把调试模式恢复为关闭状态。对于持续集成的环境,可以在部署脚本中检查 display_errors 是否为 Off,避免误开。
常见问题
已经设置了 display_errors=On,为什么还是白屏?
可能原因包括:脚本存在语法错误导致设置代码未执行;输出缓冲未刷新;自定义错误处理器或框架异常处理拦截了输出;或者错误发生在 PHP 启动阶段(如 auto_prepend_file 中的错误)。建议先用命令行 php -l 检查语法,再查看错误日志,最后在入口文件最前面用 var_dump 确认配置生效。
如何在 Nginx + PHP-FPM 环境下快速看到错误?
在 PHP-FPM 池配置中临时设置 php_admin_flag[display_errors] = on 和 php_admin_value[error_reporting] = E_ALL,然后重启 PHP-FPM。注意 php_admin_flag 会覆盖脚本中的 ini_set,适合强制显示。排查完成后移除这两行并重启。