Статистика для пользователей с использованием Piwik

  • Tutorial
После того как мы вынесли наших пользователей на поддомены, нам захотелось иметь подробную статистику по каждому поддомену в отдельности, а также иметь возможность предоставлять эту статистику пользователю. Конечно, можно вручную подключать все поддомены к Google Analytics/Я.Метрика, но когда поддоменов становится достаточно много эта задача начинает выглядеть излишне сложной.

Захотелось какого-то автоматизированного решения, и оно было найдено в виде системы статистики с открытым исходным кодом Piwik. Эту систему можно установить на свой сервер, добавить в нее ваш сайт и пользоваться. Она предоставляет функционал, в основном аналогичный GA и Я.Метрика, + имеется возможность написания собственных плагинов (например для себя я разработал виджет «вчера-сегодня-прогноз», аналогичный по функционалу такому же блоку из яндекс.метрики).

Сначала для тестов система вела статистику по 1 домену и 1 поддомену, и справлялась с этим вполне успешно, полностью заменив для меня Я.метрику и GA. Соответсвенно было принято решение использовать Piwik API для реализации автоматического подключения статистики к пользовательским поддоменам. Требовалось выполнить следующее:
  1. Создать пользователя в системе Piwik
  2. Создать сайт в пивике
  3. Выдать пользователю права для просмотра статистики по сайту
  4. Получить id сайта для установки счетчика


Немного расскажу про Piwik API. Работает оно таким образом: весь Piwik состоит из модулей, и некоторые модули предоставляют API функции. Любой разработчик может написать модуль и реализовать в нем какую-либо API функцию, которую затем можно будет вызвать.
Вызов функций API проще всего реализовать запросом к определенному адресу, например так:
example.com/piwik/index.php?module=API&method=UsersManager.getUsersLogin&format=PHP&prettyDisplay=true&token_auth=14e1b600b1fd579f47433b88e8d85291
В данной строке example.com/piwik/index.php это путь к нашему установленному пивику, method=UsersManager.getUsersLogin это модуль и функция, которую мы вызываем, format=PHP означает что нам необходимо получить данные в виде сериализованного массива для использования в PHP, prettyDisplay=true это параметр, который принимает API функция и token_auth это наш токен, получить который мы можем в нашем пивике на странице управления пользователями или на странице со списком API функций.

Соответственно самый простой способ обратиться к Piwik API из PHP выглядит примерно так:
        $url = 'http://example.com/piwik/index.php?module=API&method=UsersManager.getUsersLogin&format=PHP&prettyDisplay=true&token_auth=14e1b600b1fd579f47433b88e8d85291'
        $tmp = file_get_contents($url);
        $response = unserialize($tmp); 

В итоге получим массив $response со всеми данными, которые нам вернул Piwik.

Вернемся теперь к нашей задаче с пользовательской статистикой. Для всех наших задач в Piwik API имеются соответствующие функции:
UsersManager.addUser для создания нового пользователя, принимает в качестве параметров логин, пароль и e-mail пользователя
SitesManager.addSite для создания сайта, принимает в виде параметров название и url сайта, возвращает id сайта в системе
UsersManager.setUserAccess для выдачи прав, принимает в виде параметров логин пользователя, id сайта и права доступа (no-access/view/admin)

Выполнять вручную file_get_contents и unserialize для каждого запроса не хотелось, поэтому написал небольшой класс-обертку для Piwik API, в которой реализовал методы создания пользователя/сайта и выдачи прав.
<?php
Class Piwik_api {
    private $sAuthToken;
    private $sPiwikUrl;
    
    function __construct($sAuthToken, $sPiwikUrl) {
        $this->sPiwikUrl = $sPiwikUrl;
        $this->sAuthToken = $sAuthToken;
    }
    
    /**
    * Запрос к Piwik API
    * 
    */
    function execute($sMethodName, $arData, $sFormat = "PHP") {
        $url = $this->sPiwikUrl;
        $url .= "?module=API&method=" . $sMethodName;
        $url .= '&'.http_build_query($arData);
        $url .= "&format=$sFormat";
        $url .= "&token_auth=" . $this->sAuthToken;
        $tmp = file_get_contents($url);
        $response = unserialize($tmp);        
        
        return $response;
    }
    
    /**
    * Добавление пользователя
    * 
    */
    function addUser($sUserName, $sUserPassword, $sUserEmail) {
        
        return $this->execute('UsersManager.addUser', array("userLogin"    => $sUserName,
                                                            "password"     => $sUserPassword,
                                                            "email"        => $sUserEmail
                                                                 ));
    }
    
    /**
    * Добавление сайта
    * 
    */   
    function addSite($sSiteName, $sUrl) {
        
        return $this->execute('SitesManager.addSite', array("siteName"    => $sSiteName,
                                                            "urls"        => $sUrl
                                                            ));
    }

    /**
    * Установка прав пользователя
    * 
    */
    function setUserAccess($sUserLogin, $sAccess, $iSiteId) {
        
        return $this->execute('UsersManager.setUserAccess', array("userLogin"    => $sUserLogin,
                                                            "access"       => $sAccess,
                                                            "idSites"      => $iSiteId
                                                            ));
    }
}

Метод addSite возвращает число — это id сайта в системе пивик.

Соответственно, с использованием данного класса исходная задача решается тривиально: просто одновременно с генерацией пользовательского поддомена создаем пользователя в системе Piwik, создаем сайт и выдаем права, а затем пользователю уже выдаем ссылку на Piwik и его логин и пароль чтобы просматривать статистику. Примерно так:
                    $oPiwikApi = new Piwik_api(PIWIK_AUTH_TOKEN, PIWIK_URL);
                    $oPiwikApi->addUser($sLogin, $sPassword, $sEmail);                    
                    $iPiwikSiteId = $oPiwikApi->addSite($sSiteName, $sUrl);
                    $oPiwikApi->setUserAccess($sLogin, "view", $iPiwikSiteId);


Тут может встать вопрос доверия к статистике — для совсем недоверчивых пользователей мы оставили возможность вручную подключать GA и Я.метрику, а Piwik сделали системой для всех по-умолчанию.

После всех этих манипуляций пользователи получили статистику для своих поддоменов, полностью аналогичную по функционалу системам GA/Я.метрика, включая всю историю переходов, посетителей и т.д, и каждый пользователь видит статистику только по своему домену.

UPD:
Обзорная статья про сам пивик уже есть на хабре, данная статья скорее призвана показать насколько просто и удобно с ним работать. Кстати, сейчас обнаружил что моя проблема обсуждалась в комментариях к той статье.

Метод execute переписан с использованием http_build_query.
Поделиться публикацией

Похожие публикации

Комментарии 11

    +2
    спасибо, интересная статистика
      +2
      Статистика очень хорошая и интересная, работает стабильно. Есть софт для Android.

      Проблема этой статистики лишь в её прожорливости. На нагруженных и посещаемых сайтах, датабазу жрёт неимоверно. Помогает включение кеширования, но она сильно ест дисковую систему. Некоторые части статистики плохо оптимизированны, но она ещё в развитии и с каждым релизом становится лучше и стабильней. Удобная и продуманная API позволяет прикрутить на свой сайт статистику или баннер с таковой.

      Отличная замена привычному Google Analytics.
        0
        Насчет лучше и стабильней я бы не сказал, в последнем релизе (1.1.1) они сломали одну из самых крутых своих фишек — плагин Live

        Но в целом я пользуюсь этой статистикой около 3 месяцев, полностью согласен с вами.

        Хорошее API и возможность разработки собственных плагинов — основное преимущество, имхо.

        Насчет базы данных — у меня она стоит на пока еще не очень популярном проекте, порядка 3-4к посещений в сутки, настроил архивацию по крону — нагрузка на БД сразу упала, по сравнению с архивацией при заходе каждого посетителя.

        По месту- с 27 октября база пивика заняла 4.9 гигабайта. Собственно не считаю это проблемой, дисковое пространство нынче дешевое, а нагрузки на БД нет.
          0
          Не совсем верно выразился, в целом она становится лучше и стабильней, но временами бывает что они что-то ломают :)
            +1
            Насчёт Лайва — все мы люди грешные =)
            Думаю пофиксят. Обычно они это быстро делают.
        0
        а почему не CURL?
          0
          А зачем если так проще и понятней?
          +1
          а почему не http_build_query в методе execute
            +1
            Потому что не знал о такой функции, спасибо за наводку!
            в php столько функций что век живи-век учись
              0
              эту строку
              $url .= http_build_query($arData);
              может дополнить так
              $url .= '&'.http_build_query($arData);? :)
                0
                точно, спасибо за внимательность!

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое