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;
}
}
?>
任何建议将不胜感激...