ThinkPHP调试模式需设app_debug=true,配合PHP的display_errors=On和error_reporting=E_ALL;dump()注意调用时机与编码,SQL日志需开启数据库log.enable,调试工具栏仅HTTP请求可见。

ThinkPHP 的调试模式怎么开启
ThinkPHP 默认不启用完整调试功能,必须手动开启,否则 dump()、日志追踪、错误堆栈等都不可见。关键在于修改配置项 app_debug,它控制整个调试开关。
- 在
app.php(或config/app.php)中设置'app_debug' => true - 生产环境务必设为
false,否则会暴露敏感路径和变量信息 - 如果使用命令行运行(如
php think run),环境变量APP_DEBUG=1也可临时生效
调试时看不到错误信息?检查 error_reporting 和 display_errors
即使 app_debug = true,若 PHP 底层错误显示被禁用,ThinkPHP 也无法渲染出友好的调试页面。常见于 Nginx + PHP-FPM 部署后。
- 确认 PHP 配置中
display_errors = On(开发机通常默认开,服务器常关) -
error_reporting至少包含E_ALL,推荐设为E_ALL | E_STRICT - ThinkPHP 5.1+ 会在调试模式下自动覆盖部分 PHP 错误设置,但前提是没被
ini_set('display_errors', '0')等代码强行关闭
dump() 不输出或输出乱码?注意调用时机和输出方式
dump() 是 ThinkPHP 提供的简易调试函数,但它不是万能的,行为依赖上下文。
- 在控制器方法中直接调用
dump($data)会中断后续执行并输出 HTML 格式内容;但在中间件、模型事件、命令行任务中可能无输出或报错 - 若页面出现「headers already sent」错误,说明响应头已发出,
dump()尝试写入 HTML 失败——此时改用halt($data)或写日志Log::info($data) - 中文字符乱码多因未设置响应头编码,可在
dump()前加header('Content-Type: text/html; charset=utf-8');,但更稳妥做法是统一配置default_charset为utf-8
如何查看 SQL 日志和请求链路
ThinkPHP 的调试工具栏(Debug Toolbar)只在 app_debug=true 且请求为 HTTP 时自动注入,但 SQL 执行详情需额外配置。
立即学习“PHP免费学习笔记(深入)”;
- 确保数据库配置中开启日志:
'log' => ['enable' => true](位于database.php) - SQL 日志默认记录到
runtime/log/下,文件名含日期,内容包括绑定参数和执行时间 - 想在页面底部看到实时 SQL,需确认模板中加载了调试工具栏 JS/CSS 资源;若用了 CDN 或禁用了静态资源合并,可能丢失样式导致工具栏不可见
- 对 Ajax 请求,调试工具栏不会显示,可用
Db::getLastSql()或监听sql_explain事件捕获
Log::info('当前查询SQL', ['sql' => Db::getLastSql(), 'params' => $params]);
调试最常被忽略的是环境隔离:本地 .env 文件里设了 APP_DEBUG=true,但服务器部署时用的是打包后的 config/app.php,而这个文件里仍写着 false——两个配置打架,结果就是你以为开了调试,其实没开。











