1. 项目概述:基于ThinkPHP与Laravel的微信小程序考试系统
去年接手过一个教育培训机构的在线考试系统改造项目,他们原有的PC端系统已经无法满足学员碎片化学习需求。当时我们采用ThinkPHP+Laravel混合架构开发了微信小程序端的刷题分析系统,上线后日活提升了300%。这种技术组合既能复用原有PHP业务逻辑,又能享受Laravel现代化开发体验。
考试刷题类小程序核心要解决三个问题:海量题目的高效组织、用户行为的精准记录、学习数据的可视化呈现。我们采用ThinkPHP处理基础数据CRUD,用Laravel实现复杂的统计分析模块,两种框架优势互补。下面具体拆解实现方案。
2. 技术架构设计
2.1 混合框架选型考量
ThinkPHP6作为基础框架负责:
- 题目管理模块(题库CRUD)
- 用户基础信息管理
- 基础API接口开发
Laravel9承担的核心功能:
- 刷题行为分析(使用Eloquent ORM关联查询)
- 错题智能推荐(基于Redis有序集合)
- 学习报告生成(配合Laravel-Excel)
经验提示:两个框架共用同一个MySQL数据库时,务必统一设置数据库字符集为utf8mb4,避免ThinkPHP的默认配置导致emoji存储异常。
2.2 微信小程序端关键技术点
- 导航栏适配方案:
// 获取系统状态栏高度 const systemInfo = wx.getSystemInfoSync() this.setData({ statusBarHeight: systemInfo.statusBarHeight, navBarHeight: systemInfo.statusBarHeight + 44 })- 刷题数据实时同步:
- 使用WebSocket保持长连接(小程序端用wx.connectSocket)
- 断网时自动缓存本地(wx.setStorageSync)
- 网络恢复后差异同步(通过last_update_time字段比对)
- 性能优化技巧:
- 分页加载题目(每页20条)
- 图片懒加载(wx.createIntersectionObserver)
- 预加载下一组题目(onReachBottom时提前请求)
3. 核心功能实现细节
3.1 智能刷题引擎
题库数据结构设计:
// Laravel迁移文件 Schema::create('questions', function (Blueprint $table) { $table->id(); $table->text('content'); // 题干 $table->json('options'); // 选项(JSON存储) $table->unsignedTinyInteger('correct_index'); // 正确选项索引 $table->unsignedInteger('chapter_id'); // 所属章节 $table->json('knowledge_tags'); // 知识点标签 $table->timestamps(); });智能推荐算法逻辑:
- 记录用户每次答题行为(题目ID、耗时、是否正确)
- 使用Redis有序集合存储用户薄弱知识点:
ZINCRBY user:1:weak_knowledge 5 "三角函数" # 每错1题权重+5 - 推荐时优先抽取高权重知识点下的题目
3.2 数据分析模块
Laravel实现的学习分析看板:
// 使用数据透视表统计正确率 $stats = AnswerLog::selectRaw(' DATE(created_at) as date, COUNT(*) as total, SUM(is_correct) as correct_count' )->groupBy('date') ->get(); // 使用ChartJS渲染折线图 $this->view->with('stats', $stats);常见性能问题解决方案:
- N+1查询问题:用Laravel的with预加载关联数据
- 大数据量统计:使用Redis HyperLogLog估算UV
- 复杂计算:通过Laravel Job队列异步处理
4. 部署与运维实战
4.1 服务器环境配置
推荐使用1Panel面板部署:
- PHP8.1 + Swoole扩展(提升并发能力)
- MySQL8.0配置建议:
innodb_buffer_pool_size = 4G # 内存的50%-70% innodb_log_file_size = 256M - Redis缓存配置:
maxmemory 2gb maxmemory-policy allkeys-lru
4.2 微信小程序部署要点
HTTPS配置:
- 使用Let's Encrypt免费证书
- Nginx配置示例:
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
域名备案注意事项:
- 小程序后台配置的域名需完成ICP备案
- 非默认端口需在微信公众平台配置白名单
CDN加速方案:
- 静态资源上传到腾讯云COS
- 开启智能压缩和HTTP/2
5. 典型问题排查实录
5.1 微信小程序常见异常
media_err_network错误:
- 检查视频URL是否HTTPS
- iOS需在服务器配置正确的MIME类型:
video/mp4 mp4; video/webm webm;
背景数据获取失败:
- 确保已开通「后台数据」权限
- 检查app.json配置:
"requiredBackgroundModes": ["fetch"]
5.2 服务端调试技巧
ThinkPHP日志优化:
// config/log.php 'channels' => [ 'daily' => [ 'path' => runtime_path('logs/'.date('Ym').'/'.date('d').'.log'), 'max_files' => 30, ] ]Laravel队列监控:
# 使用Horizon监控队列 php artisan horizon接口调试工具推荐:
- 使用Yakit抓包分析小程序请求
- Postman自动化测试集合
这套系统经过三个版本的迭代,目前稳定支撑日均5万+的刷题请求。最大的体会是混合框架开发要做好边界划分,我们最终形成的约定是:ThinkPHP处理基础数据流,Laravel专注业务逻辑和数据分析,两者通过明确的Service层进行交互。对于高频访问的刷题接口,我们后来用Swoole重构了部分代码,QPS从原来的200提升到了1200+。