ThinkPHP开启调试模式需定义APP_DEBUG=true并清空runtime缓存,推荐TP6+用.env配置APP_DEBUG=true和APP_TRACE=true,同时确保PHP display_errors=On及异常处理器未拦截错误,配合fetchSql或Db::listen定位SQL问题。

ThinkPHP开启调试模式是查看详细报错信息最直接有效的方式,关键在于让框架把真实错误堆栈、SQL语句和上下文完整暴露出来,而不是只显示“页面错误!请稍后再试”。核心就两点:确保 APP_DEBUG 生效,同时让错误能真正“打出来”。
入口文件顶部定义 APP_DEBUG(最稳)
这是所有版本都认的底层开关,必须放在任何 require 或 include 之前:
- 打开 public/index.php(TP6/8)或根目录 index.php(TP5)
- 在
<?php后第一行插入:define('APP_DEBUG', true); - 清空 runtime/ 目录全部内容(缓存不清理,新配置可能不生效)
- 刷新页面,若右下角出现 Trace 小图标或完整异常页面,说明已生效
用 .env 文件配置(TP6+推荐)
适合多环境管理,但有前提:入口文件不能重复定义 APP_DEBUG,否则会被忽略:
- 项目根目录下确认存在 .env 文件(没有就复制 .example.env)
- 用纯文本编辑器写入两行(等号前后不能有空格,不能加引号):
APP_DEBUG=true<br>APP_TRACE=true
- 确保 Web 服务(Nginx/Apache)已正确传递该变量;CLI 或 Swoole 启动时需加载 .env
- 改完后重启 PHP-FPM 或 Web 服务,避免 OPCache 缓存旧值
让报错真正显示出来
APP_DEBUG 开了,但页面还是白屏或只提示 500?可能是 PHP 层没输出错误:
立即学习“PHP免费学习笔记(深入)”;
- 检查 php.ini 中
display_errors = On和error_reporting = E_ALL - TP5 可额外设置
'show_error_msg' => true(在 config/app.php) - TP6+ 默认启用异常渲染,但如果被中间件或全局异常处理器吞掉,需检查 app/exception/Handle.php 是否误 catch 了 PDOException
- 页面空白无 Trace 图标?先看浏览器开发者工具的 Network 面板,确认是否返回了 500 且响应体为空——这大概率是 PHP fatal error,得去 PHP 错误日志里查
配合 SQL 报错定位(常见 1064/1054 错误)
很多报错表面是 SQL 语法错,实际是字段名拼错、表前缀未加、时间函数写法不对。光看异常不够,要捞出真实执行的 SQL:
- 在出问题的代码前加:
echo Db::name('user')->where('id', 1)->fetchSql(true); die; - 或者临时监听:
Db::listen(function ($sql, $time, $explain) { dump($sql); }); - 确保
database.deploy.strict = false,否则某些驱动会静默过滤错误细节 - 注意:
->fetchSql(true)不执行,只生成 SQL;->getLastSql()要在执行后调用才有效



















