白屏无报错时,先在public/index.php首行加ini_set('display_errors','1');error_reporting(E_ALL);若仍无输出则查PHP错误日志;.env中#等特殊字符需用双引号包裹;Linux下类名大小写必须严格匹配;路由404需确认是否注册及伪静态配置;Session为空需检查驱动配置与权限。

白屏没报错?先暴露真实错误
生产环境白屏或500,往往不是框架坏了,而是PHP致命错误被静默屏蔽。在 public/index.php 第一行 PHP 标签后立即加上:
ini_set('display_errors', '1');error_reporting(E_ALL);
确保它出现在任何 require 或 include 之前。这能绕过 ThinkPHP 的 debug 配置,直接打出原始错误堆栈。如果仍无输出,说明问题发生在更早阶段——比如 vendor/autoload.php 加载失败,此时必须查 PHP 错误日志。
.env 文件里藏了个“#”,就可能全站白屏
ThinkPHP 依赖 phpdotenv 解析 .env,而它把 # 当作注释起始符。例如 DATABASE_PASSWORD=myPass#word123 会被截断成 myPass,后续拼接数据库连接字符串时变成空值,最终触发 include(): Filename cannot be empty。
- 所有含
#、@、$、空格等特殊字符的配置值,必须用双引号包裹,如DATABASE_PASSWORD="myPass#word123" - 单引号无效,phpdotenv 不识别
- 改完后务必清空 runtime/ 全目录(cache、log、temp、session),否则旧缓存会固化错误
Class not found?大小写和路径正在互相“失联”
Windows 开发不报错,一上 Linux 就崩,90% 是大小写惹的祸。Linux 文件系统严格区分大小写,而命名空间、文件名、use 语句三者必须完全一致。
立即学习“PHP免费学习笔记(深入)”;
- 控制器文件叫
Index.php,命名空间就得是app\controller\Index,use app\controller\Index;写成App\Controller\Index或app/controller/index都会失败 - 检查
vendor/composer/autoload_psr4.php,搜索app\,确认路径指向真实的application/目录 - IDE 自动补全有时会塞进非法命名空间,比如
use think\console\command\optimize\Route——这是命令行专用类,HTTP 请求中调用必报错,删掉
路由 404?别急着改规则,先看它有没有“注册成功”
访问 /user/list 报 404,但 /index.php/user/list 能通,大概率是 Web 服务器伪静态没配好;如果连带 index.php 也 404,那问题出在路由本身没加载。
- 执行
php think route:list,看目标路由是否出现在列表里。没有?说明定义位置错了(TP6/8 必须放在app/route/app.php,不是config/route.php) - 检查
route/app.php开头是否有use think\facade\Route;,漏了这句,整个文件里的Route::get()都不会执行 - 清除
runtime/cache/route.php和整个runtime/cache/目录,缓存会锁死旧结构 - 域名分组
Route::domain('api.example.com', function () { ... })是独立作用域,外部定义的路由不会自动进入其中
Session 读不到?不是没启动,是驱动“假动作”
调用 session('user') 返回 null,但 session_start() 没报错——这不是 PHP session 失效,而是 ThinkPHP 的会话驱动没真正写入或读取成功。
- File 驱动:检查
runtime/session/是否存在且 Web 进程有写权限(chmod -R 755 runtime最快验证) - Redis 驱动:确认
prefix不含空格或中文;serialize设为false(默认值);用redis-cli手动执行KEYS 'think_session_*'看键是否存在 - 跨子域或 HTTPS 切换丢失:ThinkPHP 默认 Cookie 不带
Domain和Secure属性,需在config/session.php中显式配置



















