Matomo — 开源网站流量统计平台,数据完全在自己手里

Google Analytics 的数据你放心吗?Matomo 完全自托管,数据存在自己数据库里,Docker 一行命令跑起来,功能不输 GA

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

Matomo 官网首页

它能做什么

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

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 只负责接收数据并快速写入日志表,繁重的聚合计算交给后台归档进程。这样即使你的网站每秒有上百次访问,追踪接口也能在几毫秒内响应。

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(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 验证等)都从缓存读,不查数据库。

追踪请求的轻量化

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

// 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 作为依赖集成进去:

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

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?

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

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

只保留自己用的功能,数据库写入量能减少一半以上。

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

多团队权限隔离

如果你同时管多个客户的网站,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,全球几十万家网站在使用。如果你正在找一个能把数据握在手里的统计工具,这个值得试一试。

参考资料

最近浏览
IP用户:220.181.*.*
55 分钟前 Baidu Spider
IP用户:112.251.*.*
1 小时前 Firefox Windows 10
累计浏览次数:3
评论
点击登录
phpreturn,PHP武器库,专注PHP领域的项目和资讯,收录和介绍PHP相关项目。

本站所有权利归 phpreturn.com 所有

举报/反馈/投稿邮箱:phpreturn@ulthon.com

鲁ICP备19027671号-2