Piwik归档官网介绍有俩种方式
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层.每一层都有三个属性
Piwik_DataTable 支持filter,sort,add,remove,edit操作.方便数据的构建与提取,效率没有深入测试.但是可以肯定他解决了大数据下的存储压力.
欢迎微博交流@旺角黑烨 http://www.bangnt.cn