你的网站现在用 Google Analytics 统计流量吗?用户行为数据全存在谷歌的服务器上,GDPR 合规让人头大,导出一份完整数据还得经过好几道审批。Matomo 就是这类问题的开源替代方案——PHP 写的,数据存你自己的服务器,功能不比 GA 差,而且没有采样限制。

它能做什么
先看它长什么样。这是 Matomo 的仪表盘:

核心能力覆盖了网站分析的大部分需求:
- 访问量追踪 — PV、UV、跳出率、平均停留时间,这些基础指标都有
- 用户行为分析 — 用户浏览路径、页面滚动深度、点击热力图、会话录制
- 转化漏斗 — 自定义目标和漏斗,从访问到下单每一步的流失率一目了然
- 实时访客 — 当前在线人数、实时访问流、实时页面 URL
- 多站点管理 — 一个 Matomo 实例管理几十个网站,每个站独立看板
- E-commerce — 订单跟踪、购物车分析、产品类别报表(如果网站有电商业务)
- API 完整 — 所有数据都能通过 HTTP API 和 PHP SDK 拉取,方便集成到自己的系统里
技术架构:一个用 PHP 写成的重型分析平台
Matomo 的前身叫 Piwik,2007 年就开始开发了。它可能是 PHP 生态里最复杂的应用之一——代码量超过百万行,数据库表超过 100 张,但依然能在普通的服务器上跑起来。
整体架构
浏览器 (matomo.js)
↓ HTTP POST
matomo.php(追踪入口)
↓ Tracker 组件写入 log_* 表
↓
归档进程(cron 或按需触发)
↓ 聚合 log 数据 → archive_* 表
↓
index.php(Web 入口)→ FrontController → 插件 Controller
↓ Twig / Vue.js 渲染
仪表盘 / 报表 / API 响应
核心设计是追踪和报表分离——matomo.php 只负责接收数据并快速写入日志表,繁重的聚合计算交给后台归档进程。这样即使你的网站每秒有上百次访问,追踪接口也能在几毫秒内响应。
插件架构
Matomo 几乎所有功能都是通过插件实现的,Core 本身保持最小化。包括默认功能在内的绝大部分模块都是插件形式存在:
plugins/
├── CoreHome/ # 首页仪表盘
├── Actions/ # 用户行为分析
├── Goals/ # 转化目标
├── SEO/ # SEO 排名报告
├── Ecommerce/ # 电商分析
├── HeatmapSessionRecording/ # 热力图 + 会话录制
├── TagManager/ # 标签管理器(类似 GTM)
└── ... # 还有几十个
插件通过事件系统和依赖注入与 Core 交互。想加功能?写个插件就行。这也是为什么 Matomo 有 Marketplace 生态——第三方开发者可以发布插件扩展功能。
性能设计
作为要处理大量写入的分析系统,Matomo 在性能上做了不少事情:
四层缓存体系:
| 缓存层 | 存储位置 | 用途 |
|---|---|---|
| Transient Cache | PHP 数组(单次请求内) | 避免同一请求重复计算 |
| Lazy Cache | 文件 / Redis | 跨请求但不常用的数据(如外部 API 结果) |
| Eager Cache | 单文件 / Redis | 每次请求都要用的全局数据(如版本号、配置) |
| Tracker Cache | 文件 / Redis | 追踪专用,避免非 INSERT 的数据库查询 |
其中 Tracker Cache 最关键——追踪请求的理想状态是只做一次 INSERT,其他所有信息(站点配置、Token 验证等)都从缓存读,不查数据库。
追踪请求的轻量化:
// matomo.php 追踪入口 — 只加载必要的插件
// 不是全部插件都加载,只有注册了 tracker 相关钩子的才会被实例化
// 这保证了追踪请求的内存占用和响应时间都尽可能小
归档机制:
原始的 log_* 表不适合直接出报表——对几亿行日志做 GROUP BY 会把数据库拖死。所以 Matomo 设计了归档进程,把日志预聚合成按天/周/月的汇总数据存到 archive_* 表。看报表时读的是已经算好的数字,速度很快。
# 推荐配置 cron 自动归档(而不是每次查看时才触发)
*/5 * * * * www-data php /path/to/matomo/console core:archive --url=https://your-matomo.com/
技术栈一览
| 层 | 技术 |
|---|---|
| 后端语言 | PHP 8.1+(要求 7.2.5+) |
| Web 框架 | 自研 FrontController + Symfony Console(CLI) |
| 前端 | Vue.js(逐步迁移中)+ Twig 模板 |
| 数据库 | MySQL / MariaDB |
| 包管理 | Composer(PHP)+ npm(前端 JS) |
| 缓存后端 | 文件 / Redis / Memcached |
| 测试 | PHPUnit + 系统测试 |
作为一个纯 PHP 项目能支撑到月访问量数亿的规模,这个架构设计值得一看。
安装
三种安装方式,从简单到复杂:
一键 Docker 部署(推荐)
docker run -d --name matomo \
-p 8080:80 \
-v matomo-data:/var/www/html \
matomo/matomo:latest
浏览器打开 http://localhost:8080 就能看到安装向导。填一下数据库信息(支持 MySQL 和 MariaDB),三步搞定。
Composer 安装(嵌入现有项目)
如果你的项目本身是 PHP 应用,可以把 Matomo 作为依赖集成进去:
composer require matomo/analytics-dev
这种方式适合需要通过 PHP API 直接操作 Matomo 的场景,比如自定义数据上报。
手动下载
直接从官网下载最新版解压到 Web 目录,和部署一个普通 PHP 项目没区别。要求 PHP 7.2.5+(推荐 8.1+)、MySQL/MariaDB、PDO 扩展。
基本使用:接入追踪
安装完成后,Matomo 会给你一段 JavaScript 追踪代码,放到网站 </body> 前面就行:
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
_paq(['trackPageView']);
_paq['enableLinkTracking'];
(function() {
var u="//your-matomo-domain.com/";
_paq['setTrackerUrl', u+'matomo.php']);
_paq['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
和 GA 的用法几乎一样。如果网站已经在用 GA,替换起来成本很低。
对于纯后端场景(比如 API 服务或 SPA),也可以用 PHP SDK 直接上报:
require 'vendor/autoload.php';
use Matomo\Tracker;
$tracker = new Tracker('https://your-matomo-domain.com/matomo.php', 1);
$tracker->doTrackPageView('订单详情页');
// 或者追踪自定义事件
$tracker->doTrackEvent('ecommerce', 'checkout', 'orderId_123');
和 Google Analytics 对比
很多人会问:既然 GA 免费而且生态成熟,为什么要换 Matomo?
| Matomo | Google Analytics | |
|---|---|---|
| 数据存储 | 你自己的服务器 | 谷歌的服务器 |
| 数据所有权 | 100% 归你 | 谷歌拥有 |
| GDPR / 隐私合规 | 天然合规,不需要用户同意弹窗 | 需要同意管理,部分地区仍存风险 |
| 采样 | 不采样,100% 数据 | 大流量站点自动采样 |
| 数据导出 | 全量随时可导出 | 有配额限制 |
| 费用 | 自托管免费,云版按量付费 | 免费(但你是产品) |
| 定制化 | 可以改代码实现任何需求 | 只能在 GA 提供的框架内定制 |
| 学习成本 | 用过 GA 的人基本零迁移成本 | - |
核心差异就一句话:GA 是用你的数据训练谷歌的广告系统,Matomo 是把数据留给自己。
一些实用技巧
IP 匿名化
如果隐私政策要求不能存储完整 IP,Matomo 支持在服务端自动截断:
// config/config.ini.php
[General]
ip_address_mask_length = 2 // 只保留前两段,192.168.x.x
或者完全匿名化:
[General]
ip_anonymize_force_on = 1
自动归档
默认情况下 Matomo 的报表是按需生成的(第一次查看时触发),数据量大时可能等几秒。可以开启 cron 自动归档,让报表提前生成好:
# 每小时执行一次
0 * * * * www-data php /var/www/html/console core:archive
禁用不需要的功能
Matomo 功能很多,但不是每个站点都需要全部。可以在管理后台关闭不需要的插件来降低资源占用:
- 不做 A/B 测试 → 关闭 A/B Testing Design
- 不需要热力图 → 关闭 Heatmap Session Recording
- 不做用户画像 → 关闭 User Profile
只保留自己用的功能,数据库写入量能减少一半以上。
多团队权限隔离
如果你同时管多个客户的网站,Matomo 有完整的权限系统:
// 通过 API 创建一个只能看某个站点的"只读用户"
$result = $matomoApi->call('UsersManager.setUserAccess', [
'userLogin' => 'client@company.com',
'idSites' => [3, 7], // 只能看这两个站
'access' => 'view' // 只读权限
]);
客户之间互相看不到对方的数据。
适用和不适用
适合用 Matomo 的场景:
- 有 GDPR / 隐私合规需求的网站(欧洲用户为主)
- 希望拥有原始访问数据的团队(数据科学、运营分析)
- 多站点统一管理( agency 型公司)
- 不想把用户行为数据交给第三方的大中型企业
不太适合的场景:
- 个人博客 / 流量极小的站点(用 Umami 或 Plausible 更轻量)
- 完全不想维护服务器的人(可以用 Matomo 云版,但要花钱)
- 需要 Google Ads / Facebook Ads 深度集成的场景(GA 在这方面确实更强)
Matomo 是 PHP 生态里最成熟的网站分析方案,GitHub 22K+ stars,全球几十万家网站在使用。如果你正在找一个能把数据握在手里的统计工具,这个值得试一试。
参考资料
- https://matomo.org/
- https://github.com/matomo-org/matomo — 22K+ Stars
- https://matomo.org/faq/ — 常见问题
- https://developer.matomo.org/api-reference/ — API 文档
原文标题: Matomo — 开源网站流量统计平台,数据完全在自己手里
原文地址: https://phpreturn.com/index/a6a1686d41eed7.html
原文平台: PHP武器库
版权声明: 本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。