首页 » Web » 正文

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

之前在屈屈的博客上看到了 Google Analytics 支持服务端发送统计信息(见此)。

新添加到GitHub,这里

通过服务端统计的优点:
1.这个方案可以解决 Google Analytics 连接缓慢的问题,提高页面打开速度,因为这个方案是通过「用户 <==> 我自己的服务器 <==> Google Analytics 的服务器」这样的方式来通信的,而不是通常的「用户 <==> Google Analytics 的服务器」,而且使用了非阻塞的方式请求(需要fastcgi)。
2.因为Adblock等一类插件,对Google Analytics的脚本进行屏蔽,所以统计信息不准确。

自己就写了一个PHP版的。。。
原理很简单,由服务端统计数据并发送到Google即可。
需要在网页后加上一小段js //修改自屈屈的js代码

<script>!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);</script>

PHP代码如下
把php放在/analytics.php处(或者换个地方,与js内相同即可)

<?php
    // **********************
    // * Author: stneng
    // * Introduction: https://stneng.com/google-analytics-异步请求(服务端请求)/
    // **********************
    $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);

?>

本文共 9 个回复

  • kn007 2017/10/08 14:32

    已用上~

  • zhujiwiki 2017/10/11 09:08

    试下,一直官方,没感觉拖慢速度

    • stneng 博主 2017/10/11 17:30

      @ zhujiwiki 那个我看了下你站,好像报错了,如果用<script src="main.js"></script>的形式加载需要把main.js里的<script>删掉,我本意是直接把整个main.js嵌入网页的。 另外,我看到你用的是子目录的形式的话,需要把js中的analytics.php前的/删去,不然会请求到根目录。

    • stneng 博主 2017/10/11 17:56

      @ zhujiwiki 刚好像说错了点什么,意识模糊了下。。。 那个你那样需要在js中把analytics.php的路径补全,类似 https://example.com/example/analytics.php

  • 天毅 2018/03/19 20:32

    一开始我也用的这个,最后还是丢在nginx层处理了

发表评论