本文实例讲述了SAE实时日志接口SDK用法。分享给大家供大家参考,具体如下:
新浪SAE是新浪研发中心开发的国内首个公有云平台,从2009年开始到现在也是也来越成熟,开放了很多接口以及服务供开发者使用。这次为了方便开发者调试分析,SAE新增实时日志查询接口。今后您可以通过API对日志信息进行筛选,并下载所需的实时日志。但是新浪SAE官方只给出的Python的实现,这里给出PHP版本的接口调用SDK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
class SaeApiHandler{
/**
* 定义accessKey
*/
private $accessKey ;
/**
* 定义secretKey
*/
private $secretKey ;
/**
* 定义时间戳
*/
private $timestamp ;
/**
* 构造函数
*/
public function __construct( $key , $sec ){
$this ->accessKey = $key ;
$this ->secretKey = $sec ;
$this ->timestamp = time();
}
/**
* 重载get方法
*/
public function __call( $name , $arg ){
$ret = array ();
if ( is_array ( $arg [0])) {
$len = count ( $arg );
for ( $i =0; $i < $len ; $i ++) {
$ret [ $i ] = $arg [ $i ][ 'fop' ] ? $this -> $name ( $arg [ $i ][ 'service' ], $arg [ $i ][ 'date' ], $arg [ $i ][ 'ident' ], $arg [ $i ][ 'fop' ]): $this -> $name ( $arg [ $i ][ 'service' ], $arg [ $i ][ 'date' ], $arg [ $i ][ 'ident' ]);
}
} else {
$ret = $arg [3] ? $this -> $name ( $arg [0], $arg [1], $arg [2], $arg [3]) : $this ->get( $arg [0], $arg [1], $arg [2]);
}
return $ret ;
}
/**
* 获取日志
* @param string 需要的日志
* @param string 时间
* @param string 日志类型
* @param string 过滤符
* @return array
*/
private function getLog( $service , $date , $ident , $fop =null){
if ( $fop ) {
$uri = '/log/' . $service . '/' . $date . '/' . $_SERVER [ 'HTTP_APPVERSION' ]. '-' . $ident . '.log?' . $fop ;
} else {
$uri = '/log/' . $service . '/' . $date . '/' . $_SERVER [ 'HTTP_APPVERSION' ]. '-' . $ident . '.log' ;
}
$ret = explode (PHP_EOL, $this ->get( $uri ));
array_splice ( $ret ,0,7);
array_pop ( $ret );
return $ret ;
}
private function get( $uri ){
$host = 'http://g.sae.sina.com.cn' . $uri ;
$ch = curl_init();
curl_setopt( $ch , CURLOPT_URL, $host );
curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $ch , CURLOPT_HTTPHEADER, $this ->saeHeader( $uri ));
curl_setopt( $ch , CURLOPT_HEADER, 1);
$ret = curl_exec( $ch );
curl_close( $ch );
return $ret ;
}
/**
* SAE请求头
* @return array
*/
private function saeHeader( $uri ){
return array (
'Host: g.sae.sina.com.cn' ,
'Accept: text/plain' ,
'x-sae-accesskey: ' . $this ->accessKey,
'x-sae-timestamp: ' . $this ->timestamp,
'Authorization: ' . $this ->getAuthorization( $uri )
);
}
/**
* 获取gAuthorization
*/
private function getAuthorization( $uri ){
$header = array (
'x-sae-timestamp' => $this ->timestamp,
'x-sae-accesskey' => strtolower ( $this ->accessKey)
);
ksort( $header );
$sae_header = array ( 'GET' , $uri );
foreach ( $header as $key => $value ) {
$sae_header [ count ( $sae_header )] = $key . ':' . $value ;
}
$ret = implode(PHP_EOL, $sae_header );
$auth = 'SAEV1_HMAC_SHA256 ' . base64_encode (hash_hmac( 'sha256' , $ret , $this ->secretKey,true));
return $auth ;
}
}
|
使用也很简单,实例化SaeApiHandler类,调用getLog()方法即可。该方法可以传递数组参数或者字符串,具体可以到SAE文档看,如果需要返回多组日志,则传递多个数组即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$test = new SaeApiHandler(SAE_ACCESSKEY,SAE_SECRETKEY);
$arr1 = array (
'service' => 'http' ,
'date' => '2015-07-03' ,
'ident' => 'access' ,
'fop' => 'head/1/5'
);
$arr2 = array (
'service' => 'http' ,
'date' => '2015-07-03' ,
'ident' => 'access' ,
'fop' => 'head/1/5'
);
$ret = $test ->getLog( $arr1 , $arr2 );
var_dump( $ret );
|
希望本文所述对大家PHP程序设计有所帮助。