После того как мы вынесли наших пользователей на поддомены, нам захотелось иметь подробную статистику по каждому поддомену в отдельности, а также иметь возможность предоставлять эту статистику пользователю. Конечно, можно вручную подключать все поддомены к 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.
