ThinkPHP 的 Trace 调试面板默认关闭,需同时满足 APP_DEBUG=true 和 SHOW_PAGE_TRACE=true(6.x 改为 trace 配置)才生效,仅限 HTML 响应且仅用于开发环境;其位置、标签和高度可通过 trace.page_trace、trace_page_tabs、trace_page_height 配置,常见失效原因为提前输出终止、输出缓冲干扰或非 HTML 响应类型。

Trace 调试工具默认不启用,必须手动开启且仅限开发环境
ThinkPHP 的 Trace 是内置的轻量级调试面板,不是插件也不是扩展,不需要“安装”,但默认完全关闭。它只在 APP_DEBUG = true 且配置项 SHOW_PAGE_TRACE 显式设为 true 时才生效。生产环境务必关掉——它会暴露路由、SQL、配置、文件加载路径等敏感信息。
-
APP_DEBUG必须为true(通常在app.php或环境变量中设置) -
SHOW_PAGE_TRACE默认是false,需手动设为true - 该功能仅对 HTML 响应生效,AJAX 或 JSON 接口不会显示 Trace 面板
- 若使用 Nginx + PHP-FPM,确保没有通过
fastcgi_buffering off等方式干扰响应输出
如何配置 Trace 面板的位置、选项和基础样式
Trace 面板默认出现在页面右下角,但可通过 TRACE_PAGE_TABS 和 TRACE_PAGE_HEIGHT 控制内容与高度。它的行为由数组配置驱动,不是靠 CSS 类或 JS 开关。
-
TRACE_PAGE_TABS是一个关联数组,键为标签名(如'基本'、'文件'),值为对应数据回调函数名(如'trace_base') - 官方预置了
trace_base、trace_file、trace_config、trace_sql等函数,可直接引用 - 想禁用某一项(比如不显示 SQL),就从
TRACE_PAGE_TABS数组里删掉'SQL' => 'trace_sql'这一项 -
TRACE_PAGE_HEIGHT单位是像素,默认500,调太小会导致面板内容被截断
示例配置(写入 app/config/app.php):
'trace' => [
'page_trace' => true,
'trace_page_tabs' => [
'基本' => 'trace_base',
'文件' => 'trace_file',
'SQL' => 'trace_sql',
],
'trace_page_height' => 420,
],
为什么开了 SHOW_PAGE_TRACE 却没看到面板?常见失效原因
最常遇到的是「配置写了但没生效」,根本原因往往不在 Trace 本身,而在框架加载顺序或响应拦截逻辑上。
立即学习“PHP免费学习笔记(深入)”;
- 控制器中提前调用了
exit、die或Response::create()->send(),导致 Trace 输出被跳过 - 使用了输出缓冲(
ob_start())但未正确 flush,或者中间件中调用了ob_end_clean() - 模板中存在语法错误(如未闭合的 PHP 标签),导致页面解析中断,Trace 无法注入
- 设置了
header('Content-Type: application/json')或其他非text/html类型,Trace 自动放弃渲染 - TP 版本差异:6.x 中
SHOW_PAGE_TRACE已被移除,改用trace配置项,旧文档容易误导
Trace 面板里的 SQL 日志不准?别信它显示的执行时间
Trace 中的 SQL 执行时间是「从 PDO::query() 返回到 fetch 完成」的粗略耗时,不包含网络延迟、连接建立、慢查询日志开销,更不反映真实并发压力下的表现。
- 它记录的是单次请求内所有 SQL,但不会合并重复语句,也不区分主从读写
- 如果用了查询缓存(如
cache(true)),Trace 仍会显示 SQL 行,但实际未发往数据库——时间接近 0,容易误判 - 批量插入(
insertAll)可能被拆成多条日志,而实际是一次 prepare + 多次 execute,Trace 不体现这个细节 - 真正要定位慢 SQL,得看 MySQL 的
slow_query_log或用EXPLAIN分析执行计划,而不是盯着 Trace 面板里的毫秒数
Trace 是帮你快速看「这次请求干了啥」,不是性能分析仪。真要压测或调优,得换 XHProf、Blackfire 或数据库原生工具。



















