海天无影's Blog

Google Analytics异步优化之php后端中转

/ 3评 / 0

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 校验和转发请求三个功能部分。

  1. 用 md5 生成符合 Google Analytics 的唯一用户 uid,作为辨别不同用户的依据。
  2. 从客户端的 cookie 来进行匹配,判断是否是回访的访客。如果客户端没有相关 cookie,这个请求就会把 uuid 写进用户端的 cookie 中。
  3. 解析 url ,通过请求采集请求的 url 获取有关信息,然后组成 www.google-analytics.com/collect 适用的 url。
  4. 服务端通过发起 cURL 请求 www.google-analytics.com,把统计的页面行为提交给 Google 即可。

来源:Google Analytics 异步方案的必要性

3条回应:“Google Analytics异步优化之php后端中转”

  1. […] 为了减少使用Google Analytics打开网页同步加载相关js文件造成的加载时间,很多大牛想到了多种异步加载优化的方法,之前用了php在后端加载一个curl来发送相关访问数据到Google analytics服务器的方法(具体查看Google Analytics异步优化之php后端中转),在博客使用了一段时间,各方面统计的数据都挺到位。 […]

  2. yalonzh说道:

    还在搞博客呀!

发表评论

电子邮件地址不会被公开。