app_debug=false导致错误被静默吞掉,页面空白时应先临时开启app_debug=true定位报错,再检查storage/logs/laravel.log日志、清空storage/framework/views缓存,并排查exit/die残留及php配置问题。

APP_DEBUG 关掉导致错误被吞掉
线上环境默认 APP_DEBUG=false,所有 PHP 错误、异常、未捕获的 fatal error 都不会输出到页面,只写进日志。你看到的“空白页”,极大概率是 PHP 报了错但被静默丢弃了。
临时验证方法:在 .env 里改成 APP_DEBUG=true,再刷新——如果立刻出现详细报错(比如 Class 'App\Http\Controllers\XXX' not found),那就坐实了这个问题。
注意:这只是临时排查手段,切勿长期开着;查完务必改回 false 并清缓存。
先看 storage/logs/laravel.log 最后几行
Laravel 所有未捕获异常、SQL 错误、配置加载失败等,都会记录在 storage/logs/laravel.log。空白页时,这是第一手线索来源。
常见线索包括:
-
production.ERROR: Class '...' not found—— 类自动加载失败,可能是命名空间写错、文件没放对位置、或composer dump-autoload没执行 -
production.ERROR: Undefined variable: xxx—— Blade 模板里用了未传入的变量 -
production.ERROR: Call to undefined method ...—— 方法名拼错,或对象为null却直接调用方法 -
production.ERROR: PDOException: SQLSTATE[HY000] [2002] Connection refused—— 数据库连不上,常见于线上数据库地址/端口/账号配置错误
检查 view 编译与缓存是否损坏
Laravel 会把 .blade.php 编译成 PHP 文件存在 storage/framework/views/ 下。如果部署时权限不对、磁盘满、或文件被部分写入,会导致编译后的内容是空的、非法 PHP,甚至只剩一个数字 2(就像你遇到的“白页只显示 2”)。
解决办法很直接:
- 删掉整个
storage/framework/views/目录(Laravel 会自动重建) - 运行
php artisan view:clear - 确认
storage/目录及其子目录可写(尤其是storage/framework/)
如果删完还是空白,说明问题不在视图编译层,要往更底层查。
PHP 本身是否提前 exit 或 die 了
有些代码会在中间件、服务提供者、甚至 bootstrap/app.php 里加了 exit、die 或 dd() 调试残留,而线上环境又不报错——结果就是请求走到一半就终止,页面什么也不输出。
排查建议:
- 全局搜索项目里有没有
exit(、die(、dd(、dump( - 重点检查自定义中间件、
AppServiceProvider::boot()、以及任何在请求生命周期早期执行的逻辑 - 如果用了第三方包,检查其服务提供者是否在初始化阶段抛出未捕获异常(比如读取不存在的配置项)
这类问题往往没有日志痕迹,因为 exit 是硬终止,连 Laravel 的异常处理器都来不及介入。
真正难搞的空白页,通常卡在“有错误但没日志 + 没输出 + 没 HTTP 状态码变化”这三重静默里。盯住 laravel.log 和 storage/framework/views/ 这两个地方,80% 的情况就能破局。











