Google Analytics虽好,但是加载一个不是很稳定的js,还是有些慢或者一些突发状况。本来想学习使用Nginx服务器端直接处理,但是一直配置不成功,后来看到这个方法,加了个中转的php文件,也可以实现异步处理。
这个服务端中转的步骤是,用户访问页面不需要加载Google Analytics的js文件,然后后端异步加载一个php页面来处理用户信息的传递给Google Analytics服务器。这样用户访问页面不需要加载多的js文件,中转服务端也可以进行传递统计了。
虽然没有直接放到Nginx端来的效率高,但是可以实现一种就是加入Google Analytics在国内访问不了,通过这个方法,只要你一个在国外的服务器,就可以成功中转出去。
(Nginx服务器后端处理请参考Google Analytics异步优化之Nginx后端处理)
Google Analytics异步优化操作
上传ga.php文件到网站根目录
<?php
// ********************
// * Author: stneng
// * Date: 2016.12.11
// * Introduction: https://u.nu/ytq
// *********************
header("status: 204");
header("Cache-Control: no-cache, max-age=0");
header("Pragma: no-cache");
$tid=''; // 在这里写 Google Analytics 给的 tid,形如:UA-XXXX-Y
function create_uuid(){$str = md5(uniqid(mt_rand(), true));
$uuid = substr($str,0,8) . '-';
$uuid .= substr($str,8,4) . '-';
$uuid .= substr($str,12,4) . '-';
$uuid .= substr($str,16,4) . '-';
$uuid .= substr($str,20,12);
return $uuid;
}
if (!isset($_COOKIE["uuid"])) {$uuid=create_uuid();
setcookie("uuid", $uuid , time()+368400000);
}else{$uuid=$_COOKIE["uuid"];
}
if (function_exists("fastcgi_finish_request")) {fastcgi_finish_request(); // 对于 fastcgi 会提前返回请求结果,提高响应速度。
}
$url='v=1&t=pageview&';
$url.='tid='.$tid.'&';
$url.='cid='.$uuid.'&';
$url.='dl='.rawurlencode(rawurldecode($_SERVER['HTTP_REFERER'])).'&';
$url.='uip='.rawurlencode(rawurldecode($_SERVER['REMOTE_ADDR'])).'&';
$url.='ua='.rawurlencode(rawurldecode($_SERVER['HTTP_USER_AGENT'])).'&';
$url.='dt='.rawurlencode(rawurldecode($_GET['dt'])).'&';
$url.='dr='.rawurlencode(rawurldecode($_GET['dr'])).'&';
$url.='ul='.rawurlencode(rawurldecode($_GET['ul'])).'&';
$url.='sd='.rawurlencode(rawurldecode($_GET['sd'])).'&';
$url.='sr='.rawurlencode(rawurldecode($_GET['sr'])).'&';
$url.='vp='.rawurlencode(rawurldecode($_GET['vp'])).'&';
$url.='z='.$_GET['z'];
$url='https://www.google-analytics.com/collect?'.$url;
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
?>
当然文件名命名或者路径都可以换为其他的,不过需要修改下的 script。将js代码放置每个页面底部。
(function(window, document, navigator, location) {
var screen = window.screen;
var encode = encodeURIComponent;
var data = ['dt=' + encode(document.title),
'dr=' + encode(document.referrer),
'ul=' + (navigator.language || navigator.browserLanguage),
'sd=' + screen.colorDepth + '-bit',
'sr=' + screen.width + 'x' + screen.height,
'_=' + (+new Date)
];
var query = '?' + data.join('&');
window.__beacon_img = new Image();
window.__beacon_img.src = '/ga.php' + query;
})(window, document, navigator, location);
Google Analytics异步优化方法原理
JS 代码完成了 url 生成和发起请求两个操作。
后端的 ga.php 页面中的代码,包含了 uuid 生成、cookie 校验和转发请求三个功能部分。
- 用 md5 生成符合 Google Analytics 的唯一用户 uid,作为辨别不同用户的依据。
- 从客户端的 cookie 来进行匹配,判断是否是回访的访客。如果客户端没有相关 cookie,这个请求就会把 uuid 写进用户端的 cookie 中。
- 解析 url ,通过请求采集请求的 url 获取有关信息,然后组成 www.google-analytics.com/collect 适用的 url。
- 服务端通过发起 cURL 请求 www.google-analytics.com,把统计的页面行为提交给 Google 即可。
[…] 为了减少使用Google Analytics打开网页同步加载相关js文件造成的加载时间,很多大牛想到了多种异步加载优化的方法,之前用了php在后端加载一个curl来发送相关访问数据到Google analytics服务器的方法(具体查看Google Analytics异步优化之php后端中转),在博客使用了一段时间,各方面统计的数据都挺到位。 […]
还在搞博客呀!
@yalonzh 是啊 一直没舍得扔