请阅读此文,如果:
- 你想快速了解matomo是如何工作的
- 你想为matomo做出点贡献或者想了解它的架构
本文假定你已经对web技术有一定的了解,比如web应用、服务器、HTTP协议、PHP等等
介绍
Matomo主要做一下两件事情:
- 收集并存储分析数据
- 对已经存储的数据出具报表
为了实现上述目的,Matomo由以下几个部分共同参与完成:
- JavaScript追踪器由Matomo提供,可被包含到网页中
- 追踪器可以收集所在网页的数据,然后通过HTTP追踪接口发送给Matomo
- 归档任务运行并预处理数据(实时动态地或通过cron任务)
- 数据通过报表的形式进行展现,它们可以通过WEB接口或者HTTP报表接口来访问
欢迎加入Matomo中文网官方QQ群255820112(点击滚动至本页末可扫描二维码),随时提问,有问必答。
插件体系
Piwik的代码库有以下两部分组成:
- Matomo内核:它提供应用的基础架构和扩展点。
- 插件:它使用内核提供的扩展点来增加新的行为和内容到应用。
插件不仅是为第三方开发者定制开发设计;大部分的matomo功能也是基于插件形式开发的。Matomo内核被设计的尽量小。
这样,就存在两种插件:
- 默认插件:提供Matomo的基本特性,它们随版本一起发布。
- 可选插件:可以被手工安装(复制插件到plugin目录)或在页面中通过Piwik市场进行安装
代码库
下面是Matomo的代码库的主要文件和目录:
config/ #配置文件目录
core/ # Matomo内核类
lang/ # 多语种文件
plugins/ # 插件类及相关的静态文件
tests/
vendor/ # 利用Composer安装的类库
console # 命令行执行文件
index.php # WEB应用和HTTP接口的入口
piwik.php # HTTP追踪API的入口
piwik.js # 集成到网站的javascript
接口
Web应用
WEB应用的入口是根目录下的index.php。这个文件初始化所有事情并调用FrontController类。
前台控制器会基于URL参数将HTTP请求路由到特定插件的控制器。
/index.php?module=CoreHome&action=index&…
在这个例子中,前台控制前会调用CoreHome插件控制器中的index活动方法。
插件控制器会返回一个视图(通常是HTML内容)作为HTTP响应。
用户界面
Piwik的用户界面是基于HTML和JavaScript的。一些页面是由PHP控制器产生的HTML文档(使用Twig模板引擎生成),另外一些Matomo用户界面是基于AngularJS。
AngularJS是前端JavaScript框架,这就意味着用户界面是在客户端浏览器构建的,其中的数据是通过HTTP报表接口(下一章会介绍)获取的,格式为JSON。这也就意味着更好的用户体验,因为Matomo开发者构建了更加动态和更具互动性的应用。
Matomo长远路标的一部分就是将越来越多的Matomo用户界面转移到AngularJS。
HTTP报表接口
HTTP报表接口工作方式上类似于WEB应用。它的角色就是以一种机器可读的格式(XML,JSON,…)服务于报表。
它具有完全相同的入口,并且也是通过前台控制器进行分发。
/index.php?module=API&method=SEO.getRank&…
上面的网址表示插件名称是API,action没被指明则默认指向index。
接下来Piwik\Plugin\API\Controller类会被调用,然后它会将调用分发到目标API,就如同API调用的第二层前端控制器一样。在上述例子中,SEO.getRank代表Piwik\Plugin\SEO\API::getRank()会被调用。
HTTP追踪接口
HTTP接口使得JavaScript追踪器能够提交分析数据到Matomo,然后由Matomo进行保存。
它的入口有别于Matomo的Web应用和HTTP报表接口,它是通过piwik.php文件来完成。
了解更多关于HTTP追踪接口的内容。
命令行
Matomo通过./console提供命令行接口。它是基于Symfony控制台组件开发的。
插件可以开发命令并以以下方式调用
./console visitorgenerator:generate-visits
Command类位于 plugins/*/Commands并可以被Matomo自动监测到。
阅读更多关于Matomo命令行的内容
数据模型,数据处理和数据存储
Matomo让你可以收集数据,然后以报表的形式获取。让我们一起来看看其间Matomo是如何建模、处理和存储数据的。
日志数据:原始分析数据
HTTP追踪接口(如Piwik\Tracker组件)用来获取原始分析数据,我们称之为“日志数据”。
日志数据用Piwik\Tracker\Visit对象来表示,并被存储到下面几张表:
- log_visit:每次访问对应一条记录
- log_action:包含网站上各种类型的行为(如独立url,网页标题,下载网址)
- log_link_visit_action:访客的每个行为对应一条记录(网页浏览)
- log_conversion:包含访问过程中所有的转化(与目标匹配的行为)
- log_conversion_item:包含电子商务转化条目
这些表被设计和优化已达到最快的插入效率,因为追踪接口需要这样才能搞定大流量的网站。
关于这些表的内容(和它们对应的PHP实体)在“Matomo数据库结构”中有详细解释。
归档处理
以上数据库表无法快速获取具有高层次业务逻辑的数据:当数据量比较大的时候,将日志条目聚合到天、周、月会变得繁重。
归档处理会读取日志文件,并将其聚合成 “归档数据”。数据会被聚合并以以下方式存储:
- 天
- 周
- 月
- 年
- 自定义日期范围
归档数据可以是:
- 数值指标:它就是简单的数值(像网页访问数),它们被存储在archive_numeric_*表中,数据以float类型存储。
- 表记录:二维数据(可以是数值类型,也可以是其他任何类型),它用Piwik\DataTable对象来表示。它们被存储在archive_blob_*表中。对象是被序列化成了字符串,并被压缩存储在BLOB类型字段中。存储在数据库中的DataTable对象被称为records,用以区分DataTable。DataTable对象是通过Matomo接口操作和返回的,我们称之为reports。
所有数值指标或表记录都会以按天、按周、按月方式进行处理和存储。就拿入口页面报告来说,数据库中有每天的数据,每周的数据,每月的数据,每年的数据,甚至自定义日期范围对应的数据。这些数据看起来是冗余的,但它带来了读取效率的提高。
由于归档数据需要被快速请求,它们被分割到不同的月份了,所以在数据库中,你可以看到:
- archive_numeric_2014_10: 2014年10月的数值指标
- archive_blob_2014_10:2014年10月的报表
- archive_numeric_2014_11: 2014年11月的数值指标
- archive_blob_2014_11: 2014年11月的报表
归档表的内容在“Matomo数据库结构”中有详细介绍。归档过程在“Matomo归档原理”中有详细介绍。
从归档数据到报表
就像上面所展示的那样,数据会以数值指标或表记录的方式存储。报表(reports)是DataTable对象,它由插件中定义的API类生成。API类访问被持久化的数值指标和记录(records)并将其转化成可呈现的报表。
有时候,一个持久化的记录可以是多个API报告的数据源。
你可以在“Matomo报告”中阅读更多关于报告是如何被创建和服务的内容。
Piwik扩展点
Matomo内核只定义了主要的流程和行为。插件可以基于内核进行扩展和定义,有以下扩展点:
- 注册行为到事件(Events),或触发事件(Events)
- 实现特定类,Matomo可以自动识别它们
- 继承某些抽象基类
你可以在“Piwik扩展点”阅读更多关于此专题的内容。