I use Measurement Protocol Parameter Reference in PHP to setup Google Analytics using PHP. For now all works fine only I can't figure out how to setup Timing.
In my GA dashboard session duration not work and I need to add that.
Here is reference of TIMING and I don't understand how to setup that.
Do I need to setup some sessions or I need to read __utma, __utmb, __utmc... cookies?
This is all in the initial stage but it works perfectly.
/**
* Generic Server-Side Google Analytics PHP Client
*
* PHP version 5
*
* @category Google Analytics
* @author Ivijan-Stefan Stipić <ivijan.stefan@gmail.com>
* @copyright 2015 CreativForm
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version 1.4
* @link http://creativform.com/
*/
class cfSSGA
{
// Google Analysis Measurement Protocol Parameter URL
private $analyticsURL = 'https://ssl.google-analytics.com/collect?payload_data&{URL-DATA}';
// Default Options
private $option=array(
// Google Analysis ID xx-xxxxxxxx-x
'gaID' => 'xx-xxxxxxxx-x',
// 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception', 'timing'
'hitType' => 'pageview',
// page URL
'pageURL' => NULL,
// page Title
'pageTitle' => NULL,
// page Encoding
'pageEncoding' => 'UTF-8',
);
function __construct($options)
{
$this->__session_start();
if(function_exists("array_replace") && version_compare(phpversion(), '5.3.0', '>='))
$this->option=(object)array_replace($this->option, $options); // (PHP 5 >= 5.3.0)
else
$this->option=(object)array_merge($this->option, $options); // (PHP 5 < 5.3.0)
// Send data to GA
$this->sendData();
}
private function sendData(){
$aux = $this->__utmz();
$data = array(
/* Page Tracking Setup */
'v' => 1, // Version.
'tid' => $this->option->gaID, // Tracking ID / Property ID.
'cid' => $this->ParseOrCreateAnalyticsCookie(), // Anonymous Client ID.
'uid' => $this->__userID(), // Anonymous User ID.
't' => $this->option->hitType, // Pageview hit type.
'dh' => $_SERVER["HTTP_HOST"], // Document hostname.
'z' => mt_rand(1000000000, 9999999999), // hash URL
'dp' => (is_null($this->option->pageURL)?@$_SERVER["REQUEST_URI"]:$this->option->pageURL), // Page.
'dt' => (is_null($this->option->pageTitle)?@$_SERVER["REQUEST_URI"]:$this->option->pageTitle), // Title.
'dl' => "https://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"], // Send full URL
/* Using a Proxy Server */
'uip' => $this->ip(), // IP address override.
'ua' => $_SERVER['HTTP_USER_AGENT'], // User agent override.
// Traffic Source
'cn' => $aux->utmccn,
'cs' => $aux->utmcsr,
'cm' => $aux->utmcmd,
'ck' => $aux->utmctr,
'dr' => $_SERVER['HTTP_REFERER'],
// Page Encoding
'de'=>$this->option->pageEncoding,
);
if(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])) $data['ul']=strtolower(substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,5)); // set language
// AdWords tracking
if(!empty($aux->utmgclid)){
$data['gclid']=$aux->utmgclid;
}
if(!empty($aux->utmgclid)){
$data['cc']=$aux->utmcct;
}
if(!empty($aux->utmgclid)){
$data['ci']=$aux->utmcid;
}
// send GET data
$url=array();
$data=array_map("trim", $data);
foreach($data as $get=>$val)
{
if(!is_null($val) && !empty($val))
$url[]=$get.'='.str_replace('+','%20',urlencode($val));
}
$getString=join("&",$url);
$getString=str_replace("{URL-DATA}",$getString,$this->analyticsURL);
## DEBUG
ob_start();
var_dump($getString);
$str=ob_get_clean();
echo '<!--
'.$str.'
-->';
###########
file_get_contents($getString);
}
// read __utmz cookie - Traffic Source
private function __utmz(){
// Default ID's of Traffic Source Cookie
$trafficSourceDefault = array(
'utmcid' => false, // lookup table id
'utmcsr' => $_SERVER['HTTP_REFERER'], // campaign source
'utmgclid' => false, // google ad click id
'utmccn' => '(organic)', // campaign name
'utmcmd' => 'organic', // campaign medium
'utmctr' => '(not set)', // keywords
'utmcct' => false, // ad content description
);
$trafficSource=array();
$all_data=array();
if(isset($_COOKIE['__utmz']) || isset($_GET['__utmz'])){
$cookie = ((isset($_GET['__utmz']) && !empty($_GET['__utmz'])) ? $_GET['__utmz'] : $_COOKIE['__utmz']);
// Parse __utmz cookie
list($domain_hash, $timestamp, $session_number, $campaign_numer, $campaign_data) = preg_split('[\.]', $cookie, 5);
// Parse the campaign data
$campaign_data = parse_str(str_replace("|", "&", $campaign_data));
// construct all
if(isset($utmcid)&&!empty($utmcid)) $all_data['utmcid']=$utmcid;
if(isset($utmcsr)&&!empty($utmcsr)) $all_data['utmcsr']=(strtolower($utmcmd)=='organic'?"https://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]:$utmcsr);
if(isset($utmgclid)&&!empty($utmgclid)) $all_data['utmgclid']=$utmgclid;
if(isset($utmccn)&&!empty($utmccn)) $all_data['utmccn']=$utmccn;
if(isset($utmcmd)&&!empty($utmcmd)) $all_data['utmcmd']=$utmcmd;
if(isset($utmctr)&&!empty($utmctr)) $all_data['utmctr']=$utmctr;
if(isset($utmcct)&&!empty($utmcct)) $all_data['utmcct']=$utmcct;
if(str_replace(array("http","https",":","/","www."),"",$_SERVER['HTTP_REFERER'])==$_SERVER["HTTP_HOST"]){
unset($all_data['utmccn']);
unset($all_data['utmcsr']);
unset($all_data['utmcmd']);
$all_data['utmccn']='(organic)';
$all_data['utmcsr']=$_SERVER["HTTP_HOST"];
$all_data['utmcmd']='organic';
}
}
if(function_exists("array_replace") && version_compare(phpversion(), '5.3.0', '>='))
$data=(object)array_replace($trafficSourceDefault, $all_data); // (PHP 5 >= 5.3.0)
else
$data=(object)array_merge($trafficSourceDefault, $all_data); // (PHP 5 < 5.3.0)
return $data;
}
// Gets the current Analytics session identifier or create a new one if it does not exist
private function ParseOrCreateAnalyticsCookie(){
if (isset($_COOKIE['_ga']) && !empty($_COOKIE['_ga']))
{
// An analytics cookie is found
list($version, $domainDepth, $cid1, $cid2) = preg_split('[\.]', $_COOKIE["_ga"], 4);
$contents = array(
'version' => $version,
'domainDepth' => $domainDepth,
'cid' => $cid1.'.'.$cid2
);
$cid = $contents['cid'];
}
else
{
// no analytics cookie is found. Create a new one
$cid1 = mt_rand(0, 2147483647);
$cid2 = mt_rand(0, 2147483647);
$cid = $cid1 . '.' . $cid2;
setcookie('_ga', 'GA1.2.' . $cid, (time() + (60 * 60 * 24 * 365 * 2)), '/');
}
return $cid;
}
// GET IP address
private function ip(){
if(isset($_SERVER['HTTP_CLIENT_IP']) && filter_var($_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
return $_SERVER['HTTP_CLIENT_IP'];
elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && filter_var($_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
return $_SERVER['HTTP_X_FORWARDED_FOR'];
else
return $_SERVER['REMOTE_ADDR'];
}
// session hendler
private function __session_start()
{
$start = true;
if ( php_sapi_name() !== 'cli' ) {
if ( version_compare(phpversion(), '5.4.0', '>=') )
$start = (session_status() === PHP_SESSION_ACTIVE ? true : false);
else
$start = (session_id() === '' ? false : true);
} else $start = false;
if ( $start === false ) session_start();
}
// user ID
private function __userID()
{
if(isset($_SESSION['_ga_uid']) && !empty($_SESSION['_ga_uid']))
{
return $_SESSION['_ga_uid'];
}
else
{
$hash=mt_rand(1000000,9999999).'.'.time();
$hash=str_replace(array("=","_","-","+"),"",base64_encode($hash));
$_SESSION['_ga_uid']=$hash;
return $hash;
}
}
}
// Activate SSGA
new cfSSGA(array(
'gaID'=>'UA-xxxxxxx-2'
));
Feel free to test and use. Thanks!