🌸
💫
Skip to content
Unofficial Docs CCCYUN Toolbox

插件调试技巧

This content is not available in your language yet.

🐛 调试技巧

快速定位问题,提高开发效率

编辑项目根目录的 .env 文件:

# 开启调试模式
APP_DEBUG = true
# 显示错误信息
APP_TRACE = true

注意:生产环境请关闭调试模式!

开启调试模式后:

  • ✅ 显示详细的错误信息
  • ✅ 显示 SQL 执行记录
  • ✅ 显示运行时间和内存占用
  • ✅ 显示文件加载列表

日志文件位于 runtime/log/ 目录:

runtime/
└── log/
├── 202602/
│ ├── 10.log # 按日期分文件
│ └── 09.log
└── cli/
└── 20260210.log # 命令行日志

在插件中记录日志:

<?php
namespace 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('处理结果为空');
}
}
}
级别方法用途
debugLog::debug()调试信息
infoLog::info()一般信息
noticeLog::notice()注意信息
warningLog::warning()警告信息
errorLog::error()错误信息
criticalLog::critical()严重错误
alertLog::alert()警报信息
emergencyLog::emergency()紧急信息
  1. 打开开发者工具

    • Chrome/Firefox/Edge: 按 F12Ctrl+Shift+I
  2. 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('操作耗时');
  3. Network 面板

    • 查看 AJAX 请求
    • 检查请求参数和响应
    • 分析加载性能
  4. Elements 面板

    • 检查 HTML 结构
    • 调试 CSS 样式
    • 实时修改测试
// 在发送请求前输出信息
$.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
// 简单输出
var_dump($data);
// 带格式输出
echo '<pre>';
var_dump($data);
echo '</pre>';
// 终止执行并输出
die(var_dump($data));
<?php
// 数组输出
print_r($array);
// 带格式
echo '<pre>';
print_r($array);
echo '</pre>';
<?php
// ThinkPHP 提供的调试函数
use function think\dump;
// 输出变量
dump($data);
// 输出多个变量
dump($var1, $var2, $var3);
// 终止执行
dump($data);
die;
  1. 安装 Xdebug

    Terminal window
    # Ubuntu/Debian
    sudo apt install php-xdebug
    # 配置 php.ini
    zend_extension=xdebug.so
    xdebug.mode=debug
    xdebug.start_with_request=yes
    xdebug.client_host=127.0.0.1
    xdebug.client_port=9003
  2. VS Code 配置 安装 PHP Debug 扩展,配置 launch.json

    {
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Listen for Xdebug",
    "type": "php",
    "request": "launch",
    "port": 9003
    }
    ]
    }
<?php
use 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';

可能原因

  1. PHP 语法错误
  2. 缺少必要的扩展
  3. 文件权限问题
  4. 内存不足

排查步骤

Terminal window
# 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

可能原因

  1. 数据库服务未启动
  2. 配置信息错误
  3. 防火墙阻止
  4. 用户权限不足

排查步骤

Terminal window
# 1. 检查数据库服务
sudo systemctl status mysql
# 2. 测试连接
mysql -u toolbox -p -h localhost
# 3. 检查配置
cat .env | grep DB_
# 4. 检查端口
netstat -tlnp | grep 3306

可能原因

  1. PHP 错误被隐藏
  2. 模板文件缺失
  3. 内存溢出
  4. 无限循环

排查步骤

<?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]);
}

排查步骤

// 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}");
工具用途推荐度
Xdebug断点调试⭐⭐⭐⭐⭐
Tracy错误展示⭐⭐⭐⭐
Whoops错误处理⭐⭐⭐⭐
PHP Debug Bar性能分析⭐⭐⭐⭐
工具用途推荐度
Chrome DevTools前端调试⭐⭐⭐⭐⭐
PostmanAPI 测试⭐⭐⭐⭐⭐
Vue.js DevToolsVue 调试⭐⭐⭐⭐
扩展用途
PHP DebugPHP 断点调试
PHP IntelephensePHP 代码提示
HTML CSS SupportHTML/CSS 提示
JavaScript DebuggerJS 调试

当你遇到问题时,按以下顺序检查:

  • 查看错误日志 (runtime/log/)
  • 开启调试模式 (.envAPP_DEBUG = true)
  • 检查文件权限 (chmod -R 755 plugin/)
  • 验证配置文件 (.env 数据库配置)
  • 检查 PHP 扩展 (php -m)
  • 查看浏览器 Console (F12)
  • 检查 Network 请求 (AJAX 调试)
  • 添加日志记录 (Log::info())
  • 简化测试代码 (最小化复现)
  • 对比正常插件 (找差异)

🐛 调试是开发的必修课!

掌握调试技巧,开发效率翻倍~