ThinkPHP调试模式必须在public/index.php最顶部、框架加载前定义define('APP_DEBUG', true),否则Trace工具栏、错误堆栈、SQL详情等全部失效;需同步设置APP_TRACE=true、ini_set('display_errors', '1'),并清空runtime目录。

ThinkPHP调试模式不会自动开启,必须在框架加载前明确声明APP_DEBUG为true;否则Trace工具栏、错误堆栈、SQL详情等全部失效。
入口文件必须最先定义APP_DEBUG
ThinkPHP在public/index.php中极早期就检查APP_DEBUG常量,一旦错过时机,后面任何修改都无效。
- 在
public/index.php最顶部、任何require或include语句之前写:define('APP_DEBUG', true); - 不要写在
think\App实例化之后,也不要放在config/app.php里设'app_debug' => true——这个配置只在APP_DEBUG === true时才被读取 - TP8 不推荐在入口文件用
define,因为会绕过环境加载逻辑,导致App::isDebug()判断失准;但如果你没用.env,这是唯一可靠方式 - 改完后务必清空
runtime/目录(含~runtime.php),否则缓存可能让改动不生效
APP_TRACE要和APP_DEBUG一起开
Trace工具栏不是默认随APP_DEBUG自动启用的,它由独立的APP_TRACE控制。只开APP_DEBUG而没开APP_TRACE,页面右下角不会出现小图标。
- 在
.env中写两行(注意等号两侧**不能有空格**,编码必须是UTF-8无BOM):APP_DEBUG=true、APP_TRACE=true - 如果不用
.env,可在public/index.php顶部紧接define('APP_DEBUG', true)之后加:define('APP_TRACE', true); - TP6+ 中
APP_TRACE仅对 HTML 响应生效,AJAX 接口返回 JSON 时不会渲染工具栏——这不是 bug,是设计如此 - 即使开了
APP_TRACE,若config/log.php中'level'没包含'sql'或'notice',面板里的 SQL 标签页可能为空
白屏或看不到错误?先查 PHP 底层是否拦住了
就算APP_DEBUG = true,如果 PHP 自身禁用了错误输出,ThinkPHP 的调试页面照样出不来。
立即学习“PHP免费学习笔记(深入)”;
- 在
public/index.php顶部、define('APP_DEBUG', true)之后立即加:ini_set('display_errors', '1'); - Nginx + PHP-FPM 环境下,检查
fastcgi_intercept_errors是否为on,必须设为off,否则 500 错误会被 Nginx 拦截并返回空白页 - 确认
error_reporting至少为E_ALL,TP5.1+ 会尝试覆盖,但若之前被ini_set('error_reporting', 0)强行关掉,仍会失效 - 某些底层异常(如数据库连接失败、扩展缺失)可能根本进不到 ThinkPHP 异常处理器,此时得直接查 PHP 错误日志(路径可用
phpinfo()确认)
自定义异常处理器会吞掉调试信息
如果你在config/app.php中改了'exception_handle',比如指向自己的类,那默认的调试视图大概率不会出现。
- 确保你的异常处理类中,在
render()方法里调用了parent::render($e),否则堆栈和 Trace 面板不会注入 - TP6 默认使用
think\exception\Handle,它内部已适配调试模式;若替换成其他类,需手动判断$this->app->isDebug()再决定是否渲染详细页面 - CLI 下运行命令(如
php think run)默认不显示 Trace 面板,加-v参数或在config/console.php中设'verbose' => true才可能看到部分调试输出
真正卡住人的地方,往往不是“怎么开”,而是APP_DEBUG实际值被谁覆盖、在哪一层被关掉、以及runtime/缓存有没有清干净。尤其多人协作时,不同入口文件、不同环境的.env、Git 忽略策略,都可能导致你以为开了,其实没开。


















