php框架thinkphp怎么调试_php框架内置调试功能方法【方法】

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_charsetutf-8

如何查看 SQL 日志和请求链路

ThinkPHP 的调试工具栏(Debug Toolbar)只在 app_debug=true 且请求为 HTTP 时自动注入,但 SQL 执行详情需额外配置。

  • 确保数据库配置中开启日志:'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——两个配置打架,结果就是你以为开了调试,其实没开。