Piwik代码阅读-数据归档,
Piwik代码阅读-数据归档,
2019独角兽企业重金招聘Python工程师标准>>>
归档API触发
Piwik归档官网介绍有俩种方式
但细看代码后,其实都是http请求API触发归档作业.可以参考下面的地址
http://localhost/piwik-dev/index.php?module=API&method=VisitsSummary.getVisits&idSite=2&period=day&date=last2&format=php&token_auth=c09618137503f2dc75b96ab8cfa19f51&trigger=archivephp其中 period 是用来区分归档的类型,日、周、月(day,week,month). date是处理日期,它支持日期语义,例如'last30', 'previous10' or 'YYYY-MM-DD,YYYY-MM-DD'这些类型. module=API&method=VisitsSummary.getVisits 调用的是plugin/VisitsSummary/API.php中的getVisits方法.
protected function getNumeric($idSite, $period, $date, $segment, $toFetch)
{
Piwik::checkUserHasViewAccess($idSite);
$archive = Piwik_Archive::build($idSite, $period, $date, $segment);
$dataTable = $archive->getNumeric($toFetch);
return $dataTable;
}
public function getVisits($idSite, $period, $date, $segment = false)
{
return $this->getNumeric($idSite, $period, $date, $segment, 'nb_visits');
}
归档实例
Piwik_Archive类的build是用来构建归档的实例方法,Piwik_Archive有俩个子类
1.Piwik_Archive_Array(处理多个任务),该类又有俩个子类实现.
> Piwik_Archive_Array_IndexedByDate(多个日期)
> Piwik_Archive_Array_IndexedBySite(多个网站)
2.Piwik_Archive_Single(只处理单个任务)
多任务的实例其实是用数组创建了多个Piwik_Archive_Single实例.也就是递归处理Piwik_Archive_Single的实现.
按照上面API请求,是要处理最近2天的归档.那么将会构建出Piwik_Archive_Array_IndexedByDate的实例
归档调用
Piwik_Archive的子类都会实现prepareArchive()方法,该方法是用来获取一个idarchive,如果该idarchive无效,将会启动新的归档进程ArchiveProcessing->launchArchiving(),这个方法就是用来调用所有归档逻辑.
public function launchArchiving()
{
if (!Piwik::getArchiveProcessingLock($this->idsite, $this->period, $this->segment)) {
Piwik::log('Unable to get lock for idSite = ' . $this->idsite
. ', period = ' . $this->period->getLabel()
. ', UTC datetime [' . $this->startDatetimeUTC . ' -> ' . $this->endDatetimeUTC . ' ]...');
return;
}
$this->initCompute();
$this->compute();
$this->postCompute();
// we execute again the isArchived that does some initialization work
$this->idArchive = $this->isArchived();
Piwik::releaseArchiveProcessingLock($this->idsite, $this->period, $this->segment);
}
ArchiveProcessing有俩个子类:
1.ArchiveProcessing_Day(处理period为day的类型) 2.ArchiveProcessing_Period(处理period为week,month的类型)
这俩个类都会实现compute()方法,例如 ArchiveProcessing_Day 类中
protected function compute()
{
if (!$this->isThereSomeVisits()) {
return;
}
Piwik_PostEvent('ArchiveProcessing_Day.compute', $this);
}
Piwik_PostEvent方法是通知观察者调用所有注册过ArchiveProcessing_Day.compute事件的方法,例如Actions.php中的注册.
public function getListHooksRegistered()
{
$hooks = array(
'ArchiveProcessing_Day.compute' => 'archiveDay',
'ArchiveProcessing_Period.compute' => 'archivePeriod',
'WidgetsList.add' => 'addWidgets',
'Menu.add' => 'addMenus',
'API.getReportMetadata' => 'getReportMetadata',
'API.getSegmentsMetadata' => 'getSegmentsMetadata',
);
return $hooks;
}
Piwik_Actions->archiveDay()方法是处理Actions的归档逻辑.
在此就进入具体的业务逻辑实现,不详细说明(涉及网站分析的数据挖掘)
归档存储
这里是我阅读当中最兴奋的地方 Piwik_DataTable 一个存储数据结构,用来存储复杂的表数据,Piwik_DataTable 序列化后存入Mysql中的Blob表中,Piwik_DataTable 有点BigTable的影子,限制最多存储15层.每一层都有三个属性
- columns:数组类型,存储字段值
- metadata:数组类型,存储元数据信息(可选)
- subTable:(可选)
Piwik_DataTable 支持filter,sort,add,remove,edit操作.方便数据的构建与提取,效率没有深入测试.但是可以肯定他解决了大数据下的存储压力.
欢迎微博交流@旺角黑烨 http://www.bangnt.cn
转载于:https://my.oschina.net/max1984/blog/151452
评论暂时关闭