Piwik代码阅读-数据归档

归档API触发

Piwik归档官网介绍有俩种方式

  1. 实时归档,http请求触发
  2. crontab调用,执行 misc/cron/archive.php

但细看代码后,其实都是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

你可能感兴趣的:(piwik)