После того как мы вынесли наших пользователей на поддомены, нам захотелось иметь подробную статистику по каждому поддомену в отдельности, а также иметь возможность предоставлять эту статистику пользователю. Конечно, можно вручную подключать все поддомены к Google Analytics/Я.Метрика, но когда поддоменов становится достаточно много эта задача начинает выглядеть излишне сложной.
Захотелось какого-то автоматизированного решения, и оно было найдено в виде системы статистики с открытым исходным кодом Piwik. Эту систему можно установить на свой сервер, добавить в нее ваш сайт и пользоваться. Она предоставляет функционал, в основном аналогичный GA и Я.Метрика, + имеется возможность написания собственных плагинов (например для себя я разработал виджет «вчера-сегодня-прогноз», аналогичный по функционалу такому же блоку из яндекс.метрики).
Сначала для тестов система вела статистику по 1 домену и 1 поддомену, и справлялась с этим вполне успешно, полностью заменив для меня Я.метрику и GA. Соответсвенно было принято решение использовать Piwik API для реализации автоматического подключения статистики к пользовательским поддоменам. Требовалось выполнить следующее:
Немного расскажу про 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 выглядит примерно так:
В итоге получим массив $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, в которой реализовал методы создания пользователя/сайта и выдачи прав.
Метод addSite возвращает число — это id сайта в системе пивик.
Соответственно, с использованием данного класса исходная задача решается тривиально: просто одновременно с генерацией пользовательского поддомена создаем пользователя в системе Piwik, создаем сайт и выдаем права, а затем пользователю уже выдаем ссылку на Piwik и его логин и пароль чтобы просматривать статистику. Примерно так:
Тут может встать вопрос доверия к статистике — для совсем недоверчивых пользователей мы оставили возможность вручную подключать GA и Я.метрику, а Piwik сделали системой для всех по-умолчанию.
После всех этих манипуляций пользователи получили статистику для своих поддоменов, полностью аналогичную по функционалу системам GA/Я.метрика, включая всю историю переходов, посетителей и т.д, и каждый пользователь видит статистику только по своему домену.
UPD:
Обзорная статья про сам пивик уже есть на хабре, данная статья скорее призвана показать насколько просто и удобно с ним работать. Кстати, сейчас обнаружил что моя проблема обсуждалась в комментариях к той статье.
Метод execute переписан с использованием http_build_query.
Захотелось какого-то автоматизированного решения, и оно было найдено в виде системы статистики с открытым исходным кодом Piwik. Эту систему можно установить на свой сервер, добавить в нее ваш сайт и пользоваться. Она предоставляет функционал, в основном аналогичный GA и Я.Метрика, + имеется возможность написания собственных плагинов (например для себя я разработал виджет «вчера-сегодня-прогноз», аналогичный по функционалу такому же блоку из яндекс.метрики).
Сначала для тестов система вела статистику по 1 домену и 1 поддомену, и справлялась с этим вполне успешно, полностью заменив для меня Я.метрику и GA. Соответсвенно было принято решение использовать Piwik API для реализации автоматического подключения статистики к пользовательским поддоменам. Требовалось выполнить следующее:
- Создать пользователя в системе Piwik
- Создать сайт в пивике
- Выдать пользователю права для просмотра статистики по сайту
- Получить 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.