Google Analytics 异步请求

好好的 Google,必须折腾一番才能好好的用起来。Google 搜索如此,Google Analytics 肯定也不例外(网上据说 Google Analytics 没有被屏蔽)。 Google Analytics 支持服务端发送统计信息(via:Jerry Qu),而通过服务端统计可以解决 Google Analytics 连接缓慢问题,提高页面打开速度。


Google Analytics 服务端发送统计信息是通过「用户 <==> 博客/网站服务器 <==> Google Analytics 服务器」这样的方式来通信,而不是通常的「用户 <==> Google Analytics 服务器」,而且使用了非阻塞的方式请求(需要 fastcgi)。

下面是代码:

首先是 js 代码,添加到需要追踪的每个页面,也可以集成到主题的 js 文件。

//Google Analytics 异步请求(服务端请求)
function ga(){!function(e,n,o){var t=e.screen,a=encodeURIComponent,r=["dt="+a(n.title),"dr="+a(n.referrer),"ul="+(o.language||o.browserLanguage),"sd="+t.colorDepth+"-bit","sr="+t.width+"x"+t.height,"vp="+e.innerWidth+"x"+e.innerHeight,"z="+ +new Date],i="?"+r.join("&");e.__beacon_img=new Image,e.__beacon_img.src="/analytics.php"+i}(window,document,navigator,location);}if (window.addEventListener)window.addEventListener("load",ga,false);else if (window.attachEvent)window.attachEvent("onload",ga);else window.onload=ga;

 

如果 WordPress 主题样式文件名字为 style.css,可以将 analytics.php 放至与 style.css 相同目录下,然后使用下面代码,会自动获取到 analytics.php 路径。

//Google Analytics 异步请求(服务端请求)https://stneng.com/google-analytics-异步请求(服务端请求)/
function themeurl(){ //https://zww.me/archives/25376 - js获取WordPress主题目录函数
var i=0,got=-1,url,len=document.getElementsByTagName('link').length;
while(i<=len && got==-1){
url=document.getElementsByTagName('link')[i].href;
got=url.indexOf('/style.css');
i++;
}
return url.replace(/style(.*)/,'');
};
function ga(){!function(e,n,o){var t=e.screen,a=encodeURIComponent,r=["dt="+a(n.title),"dr="+a(n.referrer),"ul="+(o.language||o.browserLanguage),"sd="+t.colorDepth+"-bit","sr="+t.width+"x"+t.height,"vp="+e.innerWidth+"x"+e.innerHeight,"z="+ +new Date],i="?"+r.join("&");e.__beacon_img=new Image,e.__beacon_img.src= themeurl() + "analytics.php"+i}(window,document,navigator,location);}if (window.addEventListener)window.addEventListener("load",ga,false);else if (window.attachEvent)window.attachEvent("onload",ga);else window.onload=ga;

 

然后是 PHP 代码,下面代码保存为 analytics.php,并放至网站根目录。当然,也可以放至主题目录下,但是上面 js 代码中的 /analytics.php 需要补全完整路径。比如:https://xxx.com/wp-content/themes/xxx/js/analytics.php

<?php

    $tid = 'UA-xxx-Y'; //Your Google Analytics tid , like UA-XXXX-Y

    $check_referer_domain = false;
    $domain = 'xxx.com';  //If open the domain check set your domain here
    
    if (empty($_SERVER['HTTP_REFERER']) || empty($_SERVER['HTTP_USER_AGENT'])){
        echo 'error';
        die();
    }
    
    if ($check_referer_domain){
        $info = parse_url($_SERVER['HTTP_REFERER']);
        $local = isset($info['host']) ? $info['host'] : '';
        if ($local!=$domain){
            echo 'error';
            die();
        }
    }
    
    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();
    }
    
    $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);

 

如无意外,Ctrl+F5 就能看到效果。

Google Analytics 异步请求(服务端请求)

发布者:LiuCi

辛苦是获得一切的定律。