Matomo初探系列之一:Matomo工作原理

请阅读此文,如果:

  • 你想快速了解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扩展点”阅读更多关于此专题的内容。

发表评论