渠道统计需统一采集口径、前置埋点归因,并分触达/转化/留存三层建模;Yii中用Query Builder封装统计逻辑,结合缓存与流式导出,前端支持动态下钻与周期对比。

用 Yii 框架搭建渠道管理后台时,渠道数据统计不是单纯“查数据库+画图表”,关键在于数据采集口径统一、来源可追溯、维度可灵活扩展。直接写 SQL 聚合原始日志或订单表容易漏掉归因逻辑,也难支撑后续多维下钻分析。
渠道标识必须前置埋点,不能靠后端猜
用户从哪个渠道进来,必须在首次访问时就打上明确、稳定的渠道标签(如 utm_source=wechat、channel_id=102),并持久化到用户会话或注册信息中:
- Web/H5:通过 URL 参数(
ref=qq)+ 前端 localStorage 存储 + 后端登录/注册接口带入 - 小程序:利用
scene字段解析,服务端在code2Session后立即绑定渠道 ID - APP:启动时由 SDK 上报安装来源(如应用宝、华为市场)或邀请码关联的推广员 ID
- 避免依赖 UA 或 IP 归因——这类方式准确率低、不可审计
统计模型要区分“触达”“转化”“留存”三层
单一“渠道新增用户数”意义有限。Yii 后台应按业务阶段建模,每层数据独立落库、支持时间范围筛选:
-
触达层:记录每次渠道带来的访问(
channel_visit表),含时间、设备、IP、落地页 -
转化层:只统计成功注册/下单/付费的记录(
channel_conversion),必须关联原始 visit_id 实现归因闭环 -
留存层:基于用户 ID 统计次日/7日/30日回访(用
user_active_log表 + 按 channel_id 分组聚合)
用 Yii 的 ActiveRecord + Query Builder 实现高效聚合
不建议在控制器里拼大段 SQL。推荐用 Yii2 的查询构造器封装常用统计逻辑,例如:
- 定义
ChannelStatQuery类,继承\yii\db\Query,内置byDateRange()、byChannelId()等链式方法 - 统计每日各渠道注册量:
ChannelStatQuery::find()->registerCount()->groupBy('date, channel_id')->all() - 结合缓存(如 Redis)对高频报表加 5–15 分钟缓存,避免实时查大表
- 导出 Excel 时改用流式写入(
PhpOffice\PhpSpreadsheet\Writer\Xlsx),防止内存溢出
前端展示需支持动态维度切换与下钻
后台页面不要只做静态图表。用 Vue 或原生 JS 接入 ECharts,并让筛选器联动:
- 下拉选择“微信公众号” → 自动加载该渠道近 30 天的访问→注册→付费漏斗
- 点击某天的注册数 → 弹出当天所有注册用户的渠道来源明细(含设备类型、城市)
- 提供“对比周期”功能(如本周 vs 上周),自动计算增幅/下降原因标注(如“抖音素材更新导致曝光+23%”)


















