2

我寫了下列類來測量我的服務器端通信量,通過GoogleAnalytics測量協議。測量協議錯誤的位置

問題是,所有活動訪問者來自意大利,我的服務器目前在它上面 - 我認爲問題原因從fsockopen請求IP,所以有什麼方法來發送用戶的真實IP地址?

<?php 
    class GoogleAnalytics { 

     public function sendHit($method = null, $info = null) { 
      if ($method && $info) { 
       // Standard params 
       $v = 1; 
       $tid = "UA-xxxxxx-xx"; 
       $cid = $this->gaParseCookie(); 
       // Register a PAGEVIEW 
       if ($method === 'pageview') { 
        // Send PageView hit 
        $data = array(
         'v' => $v, 
         'tid' => $tid, 
         'cid' => $cid, 
         't' => 'pageview', 
         'dh' => 'xyz.com', 
         'dt' => $info['title'], 
         'dp' => $info['path'] 
        ); 
        // Send the data 
        $this->gaFireHit($data); 
       } 
      } 
     } 

     // Handle the parsing of the _ga cookie or setting it to a unique identifier 
     private function gaParseCookie() { 
      if (isset($_COOKIE['_ga'])) { 
       list($version, $domainDepth, $cid1, $cid2) = split('[\.]', $_COOKIE["_ga"], 4); 

       $contents = array(
        'version' => $version, 
        'domainDepth' => $domainDepth, 
        'cid' => $cid1 . '.' . $cid2 
       ); 

       $cid  = $contents['cid']; 
      } else { 
       $cid = $this->gaGenUUID(); 
      } 

      return $cid; 
     } 

     // Generate UUID v4 function - needed to generate a CID when one isn't available 
     private function gaGenUUID() { 
      return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', 
       // 32 bits for "time_low" 
       mt_rand(0, 0xffff), mt_rand(0, 0xffff), 
       // 16 bits for "time_mid" 
       mt_rand(0, 0xffff), 
       // 16 bits for "time_hi_and_version", 
       // four most significant bits holds version number 4 
       mt_rand(0, 0x0fff) | 0x4000, 
       // 16 bits, 8 bits for "clk_seq_hi_res", 
       // 8 bits for "clk_seq_low", 
       // two most significant bits holds zero and one for variant DCE1.1 
       mt_rand(0, 0x3fff) | 0x8000, 
       // 48 bits for "node" 
       mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) 
      ); 
     } 

     // See https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide 
     private function gaFireHit($data = null) { 
      if ($data) 
       return $this->socketPost('http://www.google-analytics.com/collect', $data); 

      return false; 
     } 

     private function socketPost($url, $params = array(), $ua = null) { 
      // create POST string 
      $post_params = array(); 

      foreach ($params as $key => &$val) { 
       $post_params[] = $key . '=' . urlencode($val); 
      } 

      $post_string = implode('&', $post_params); 

      // get URL segments 
      $parts = parse_url($url); 

      // workout port and open socket 
      $port = isset($parts['port']) ? $parts['port'] : 80; 
      $success = $fp = @fsockopen($parts['host'], $port, $errno, $errstr, 30); 

      if ($fp) { 
       // create output string 
       $output = "POST " . $parts['path'] . " HTTP/1.1\r\n"; 
       if (is_string($ua)) 
        $output .= "User-Agent: " . $ua . "\r\n"; 
       $output .= "Host: " . $parts['host'] . "\r\n"; 
       $output .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
       $output .= "Content-Length: " . strlen($post_string) . "\r\n"; 
       $output .= "Connection: Close\r\n\r\n"; 
       $output .= isset($post_string) ? $post_string : ''; 
       // send output to $url handle 
       $success = fwrite($fp, $output); 

       fclose($fp); 
      } 

      return $success ? true : false; 
     } 
    } 
?> 

任何建議,將不勝感激......

+0

您可以檢查客戶端ID是正確檢索? –

+0

@PetrHavlík'ClientID'是正確的,不幸的是我必須找到一種方法來傳遞用戶IP而不是服務器IP。 – iSun

+0

我很確定沒有這樣的參數:-) https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters –

回答

4

最後谷歌將此功能添加到測量協議,也有可能覆蓋用戶代理過。

IP Override 
parameter: &uip 
Should be a valid IP address. This will always be anonymized just as though &aip (anonymize IP) had been used. 
example: &uip=1.2.3.4 

User Agent Override 
parameter: &ua 
Should be a User Agent reported by the browser (don't forget to URL encode the value!). Note: We have libraries to identify real user agents. Hand crafting your own agent could break at any time. 
example: &ua=Opera%2F9.80%20(Windows%20NT%206.0)%20Presto%2F2.12.388%20Version%2F12.14 

Source

+0

這真是個好消息! –

+0

以這種方式設置的IP與通過GA過濾器的IP相同嗎?我的視圖中有一個IP排除過濾器,它與'uip'值相匹配,但不知何故命中仍然可以通過。 –