插件调试技巧
This content is not available in your language yet.
🐛 调试技巧
快速定位问题,提高开发效率
开启调试模式
Section titled “开启调试模式”配置调试模式
Section titled “配置调试模式”编辑项目根目录的 .env 文件:
# 开启调试模式APP_DEBUG = true
# 显示错误信息APP_TRACE = true注意:生产环境请关闭调试模式!
调试模式效果
Section titled “调试模式效果”开启调试模式后:
- ✅ 显示详细的错误信息
- ✅ 显示 SQL 执行记录
- ✅ 显示运行时间和内存占用
- ✅ 显示文件加载列表
查看日志文件
Section titled “查看日志文件”日志文件位于 runtime/log/ 目录:
runtime/└── log/ ├── 202602/ │ ├── 10.log # 按日期分文件 │ └── 09.log └── cli/ └── 20260210.log # 命令行日志在插件中记录日志:
<?phpnamespace plugin\dev\my_plugin;
use app\Plugin;use think\facade\Log;
class App extends Plugin{ public function process() { // 记录信息日志 Log::info('开始处理数据');
// 记录调试日志 Log::debug('输入数据:' . json_encode($input));
// 记录错误日志 try { $result = $this->doSomething(); } catch (\Exception $e) { Log::error('处理失败:' . $e->getMessage()); Log::error('错误堆栈:' . $e->getTraceAsString()); }
// 记录警告日志 if (empty($result)) { Log::warning('处理结果为空'); } }}| 级别 | 方法 | 用途 |
|---|---|---|
| debug | Log::debug() | 调试信息 |
| info | Log::info() | 一般信息 |
| notice | Log::notice() | 注意信息 |
| warning | Log::warning() | 警告信息 |
| error | Log::error() | 错误信息 |
| critical | Log::critical() | 严重错误 |
| alert | Log::alert() | 警报信息 |
| emergency | Log::emergency() | 紧急信息 |
前端代码调试
Section titled “前端代码调试”-
打开开发者工具
- Chrome/Firefox/Edge: 按
F12或Ctrl+Shift+I
- Chrome/Firefox/Edge: 按
-
Console 面板
// 输出调试信息console.log('普通日志');console.info('信息日志');console.warn('警告日志');console.error('错误日志');// 输出对象console.log('数据对象:', data);// 表格形式输出console.table(data);// 分组输出console.group('处理步骤');console.log('步骤 1');console.log('步骤 2');console.groupEnd();// 计时console.time('操作耗时');// ... 执行操作console.timeEnd('操作耗时'); -
Network 面板
- 查看 AJAX 请求
- 检查请求参数和响应
- 分析加载性能
-
Elements 面板
- 检查 HTML 结构
- 调试 CSS 样式
- 实时修改测试
AJAX 调试
Section titled “AJAX 调试”// 在发送请求前输出信息$.ajax({ url: '/plugin/dev/my_plugin/api', type: 'POST', data: { input: userInput }, beforeSend: function() { console.log('发送请求:', userInput); }, success: function(res) { console.log('请求成功:', res); }, error: function(xhr, status, error) { console.error('请求失败:', status, error); console.log('响应内容:', xhr.responseText); }});PHP 调试
Section titled “PHP 调试”使用 var_dump()
Section titled “使用 var_dump()”<?php// 简单输出var_dump($data);
// 带格式输出echo '<pre>';var_dump($data);echo '</pre>';
// 终止执行并输出die(var_dump($data));使用 print_r()
Section titled “使用 print_r()”<?php// 数组输出print_r($array);
// 带格式echo '<pre>';print_r($array);echo '</pre>';使用 dump()(ThinkPHP)
Section titled “使用 dump()(ThinkPHP)”<?php// ThinkPHP 提供的调试函数use function think\dump;
// 输出变量dump($data);
// 输出多个变量dump($var1, $var2, $var3);
// 终止执行dump($data);die;断点调试(Xdebug)
Section titled “断点调试(Xdebug)”-
安装 Xdebug
Terminal window # Ubuntu/Debiansudo apt install php-xdebug# 配置 php.inizend_extension=xdebug.soxdebug.mode=debugxdebug.start_with_request=yesxdebug.client_host=127.0.0.1xdebug.client_port=9003 -
VS Code 配置 安装 PHP Debug 扩展,配置
launch.json:{"version": "0.2.0","configurations": [{"name": "Listen for Xdebug","type": "php","request": "launch","port": 9003}]}
查看 SQL 语句
Section titled “查看 SQL 语句”<?phpuse think\facade\Db;
// 开启 SQL 日志Db::listen(function ($sql, $time, $explain) { // 记录 SQL 语句 trace("SQL: {$sql} [{$time}s]");
// 查看执行计划 if ($explain) { trace("EXPLAIN: " . json_encode($explain)); }});
// 获取最后执行的 SQL$sql = Db::getLastSql();echo $sql;<?php// 获取查询 SQL(不执行)$sql = Db::name('users') ->where('status', 1) ->fetchSql(true) ->select();
echo $sql;// 输出: SELECT * FROM `users` WHERE `status` = 1
// 查看查询性能$result = Db::name('users') ->where('status', 1) ->select();
echo '查询耗时: ' . Db::getQueryTime() . 's';常见问题排查
Section titled “常见问题排查”500 内部服务器错误
Section titled “500 内部服务器错误”可能原因:
- PHP 语法错误
- 缺少必要的扩展
- 文件权限问题
- 内存不足
排查步骤:
# 1. 检查 PHP 语法php -l App.php
# 2. 检查错误日志tail -f runtime/log/20260210.log
# 3. 检查文件权限ls -la plugin/dev/my_plugin/
# 4. 检查 PHP 配置grep 'memory_limit' php.ini数据库连接失败
Section titled “数据库连接失败”可能原因:
- 数据库服务未启动
- 配置信息错误
- 防火墙阻止
- 用户权限不足
排查步骤:
# 1. 检查数据库服务sudo systemctl status mysql
# 2. 测试连接mysql -u toolbox -p -h localhost
# 3. 检查配置cat .env | grep DB_
# 4. 检查端口netstat -tlnp | grep 3306可能原因:
- PHP 错误被隐藏
- 模板文件缺失
- 内存溢出
- 无限循环
排查步骤:
<?php// 在入口文件添加错误显示error_reporting(E_ALL);ini_set('display_errors', 1);
// 在控制器中添加调试public function index(){ echo '步骤 1: 进入方法';
$data = $this->getData(); echo '步骤 2: 获取数据'; var_dump($data);
return $this->view()->assign(['data' => $data]);}AJAX 请求失败
Section titled “AJAX 请求失败”排查步骤:
// 1. 检查请求是否发送$.ajax({ url: '/plugin/dev/my_plugin/api', beforeSend: function() { console.log('准备发送请求'); }, success: function(res) { console.log('请求成功', res); }, error: function(xhr, status, error) { // 2. 查看错误详情 console.error('状态码:', xhr.status); console.error('状态文本:', status); console.error('错误信息:', error); console.error('响应文本:', xhr.responseText); }});排查工具:
<?php// 1. 记录执行时间$start = microtime(true);
// ... 执行操作
$end = microtime(true);$time = round($end - $start, 4);Log::info("操作耗时: {$time}s");
// 2. 内存使用$memory = memory_get_usage(true) / 1024 / 1024;Log::info("内存使用: {$memory}MB");
// 3. 数据库查询次数$queryCount = Db::getQueryTimes();Log::info("查询次数: {$queryCount}");调试工具推荐
Section titled “调试工具推荐”PHP 工具
Section titled “PHP 工具”| 工具 | 用途 | 推荐度 |
|---|---|---|
| Xdebug | 断点调试 | ⭐⭐⭐⭐⭐ |
| Tracy | 错误展示 | ⭐⭐⭐⭐ |
| Whoops | 错误处理 | ⭐⭐⭐⭐ |
| PHP Debug Bar | 性能分析 | ⭐⭐⭐⭐ |
| 工具 | 用途 | 推荐度 |
|---|---|---|
| Chrome DevTools | 前端调试 | ⭐⭐⭐⭐⭐ |
| Postman | API 测试 | ⭐⭐⭐⭐⭐ |
| Vue.js DevTools | Vue 调试 | ⭐⭐⭐⭐ |
VS Code 扩展
Section titled “VS Code 扩展”| 扩展 | 用途 |
|---|---|
| PHP Debug | PHP 断点调试 |
| PHP Intelephense | PHP 代码提示 |
| HTML CSS Support | HTML/CSS 提示 |
| JavaScript Debugger | JS 调试 |
调试 checklist
Section titled “调试 checklist”当你遇到问题时,按以下顺序检查:
- 查看错误日志 (
runtime/log/) - 开启调试模式 (
.env中APP_DEBUG = true) - 检查文件权限 (
chmod -R 755 plugin/) - 验证配置文件 (
.env数据库配置) - 检查 PHP 扩展 (
php -m) - 查看浏览器 Console (F12)
- 检查 Network 请求 (AJAX 调试)
- 添加日志记录 (
Log::info()) - 简化测试代码 (最小化复现)
- 对比正常插件 (找差异)
🐛 调试是开发的必修课!
掌握调试技巧,开发效率翻倍~