...
|
...
|
@@ -9,6 +9,7 @@ |
|
|
* @version 1.0 (2015-9-30 16:42:51)
|
|
|
* @author fei.hong <fei.hong@yoho.cn>
|
|
|
*/
|
|
|
|
|
|
namespace Api;
|
|
|
|
|
|
use Plugin\Cache;
|
...
|
...
|
@@ -16,8 +17,14 @@ use Plugin\Cache; |
|
|
class Yohobuy
|
|
|
{
|
|
|
|
|
|
const API_URL = 'http://api2.open.yohobuy.com/';
|
|
|
const SERVICE_URL = 'http://service.api.yohobuy.com/';
|
|
|
// /* 正式环境 */
|
|
|
// const API_URL = 'http://api2.open.yohobuy.com/';
|
|
|
// const SERVICE_URL = 'http://service.api.yohobuy.com/';
|
|
|
// const YOHOBUY_URL = 'http://www.yohobuy.com/';
|
|
|
|
|
|
/* 测试环境 */
|
|
|
const API_URL = 'http://test2.open.yohobuy.com/';
|
|
|
const SERVICE_URL = 'http://test.service.api.yohobuy.com/';
|
|
|
const YOHOBUY_URL = 'http://www.yohobuy.com/';
|
|
|
|
|
|
/**
|
...
|
...
|
@@ -95,24 +102,13 @@ class Yohobuy |
|
|
*
|
|
|
* @param string $url 接口URL
|
|
|
* @param array $data 参数列表
|
|
|
* @parma mixed $cache 控制是否启用接口数据的缓存(时间单位为秒). 如3600表示缓存1小时, false表示不缓存
|
|
|
* @param bool $returnJson 控制是否返回json格式数据
|
|
|
* @param int $timeout 超时时间
|
|
|
* @return mixed
|
|
|
*/
|
|
|
public static function get($url, $data = array(), $returnJson = false, $timeout = 5)
|
|
|
public static function get($url, $data = array(), $cache = false, $returnJson = false, $timeout = 5)
|
|
|
{
|
|
|
// // 代表是否开启缓存
|
|
|
// $useCache = $cache && isset($data['client_secret']);
|
|
|
//
|
|
|
// /* 先尝试获取一级缓存(master), 有数据则直接返回 */
|
|
|
// if ($useCache) {
|
|
|
// $key = md5($url . $data['client_secret']);
|
|
|
// $result = Cache::get($key, 'master');
|
|
|
// if (!empty($result)) {
|
|
|
// return $result;
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
// 销毁私钥参数
|
|
|
if (isset($data['private_key'])) {
|
|
|
unset($data['private_key']);
|
...
|
...
|
@@ -121,6 +117,15 @@ class Yohobuy |
|
|
$url = self::httpBuildQuery($url, $data);
|
|
|
}
|
|
|
|
|
|
/* 开启缓存的情况 */
|
|
|
if ($cache) {
|
|
|
// 先尝试获取一级缓存(master), 有数据则直接返回.
|
|
|
$result = Cache::get($url, 'master');
|
|
|
if (!empty($result)) {
|
|
|
return $result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
$ch = curl_init($url);
|
|
|
curl_setopt($ch, CURLOPT_HEADER, 0);
|
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
|
...
|
...
|
@@ -131,18 +136,18 @@ class Yohobuy |
|
|
}
|
|
|
curl_close($ch);
|
|
|
$data = array();
|
|
|
|
|
|
// /* 设置一级二级缓存 或 获取二级缓存(slave) */
|
|
|
// if ($useCache) {
|
|
|
// // 如果接口异常没数据返回,则获取二级缓存
|
|
|
// if (empty($result)) {
|
|
|
// $result = Cache::get($key, 'slave');
|
|
|
// }
|
|
|
// // 如果接口正常有数据返回,则设置数据缓存
|
|
|
// else {
|
|
|
// Cache::set($key, $result);
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
/* 开启缓存的情况 */
|
|
|
if ($cache) {
|
|
|
// 接口调用异常时, 不害怕,从我们的二级缓存(slave)里再取数据.
|
|
|
if (empty($result)) {
|
|
|
$result = Cache::get($url, 'slave');
|
|
|
}
|
|
|
// 接口调用成功时,这里会设置一级(master)和二级(slave)的缓存数据.
|
|
|
else {
|
|
|
Cache::set($url, $result, $cache);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return $result;
|
|
|
}
|
...
|
...
|
@@ -165,8 +170,7 @@ class Yohobuy |
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
|
|
|
if (!empty($header)) {
|
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
|
|
|
}
|
|
|
else {
|
|
|
} else {
|
|
|
curl_setopt($ch, CURLOPT_HEADER, 0);
|
|
|
}
|
|
|
|
...
|
...
|
@@ -202,12 +206,22 @@ class Yohobuy |
|
|
*
|
|
|
* @param array $urlList 接口列表
|
|
|
* @param array $options CURL设置项
|
|
|
* @parma mixed $cache 控制是否启用接口数据的缓存 如3600表示缓存1小时, false表示不缓存
|
|
|
* @parma mixed $cache 控制是否启用接口数据的缓存(时间单位为秒). 如3600表示缓存1小时, false表示不缓存
|
|
|
* @param int $timeout 超时时间,单位是秒
|
|
|
* @return array
|
|
|
*/
|
|
|
public static function getMulti($urlList = array(), $options = array(), $cache = false, $timeout = 3)
|
|
|
{
|
|
|
/* 开启缓存的情况 */
|
|
|
if ($cache) {
|
|
|
$key = md5(implode(',', array_values($urlList)));
|
|
|
// 先尝试获取一级缓存(master), 有数据则直接返回.
|
|
|
$result = Cache::get($key, 'master');
|
|
|
if (!empty($result)) {
|
|
|
return $result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
$result = array();
|
|
|
$response = array();
|
|
|
$running = 0;
|
...
|
...
|
@@ -242,8 +256,7 @@ class Yohobuy |
|
|
do {
|
|
|
do {
|
|
|
$status = curl_multi_exec($mh, $running);
|
|
|
}
|
|
|
while ($status == CURLM_CALL_MULTI_PERFORM);
|
|
|
} while ($status == CURLM_CALL_MULTI_PERFORM);
|
|
|
|
|
|
if ($status != CURLM_OK) {
|
|
|
break;
|
...
|
...
|
@@ -252,8 +265,7 @@ class Yohobuy |
|
|
if ($running > 0) {
|
|
|
curl_multi_select($mh, 0.5);
|
|
|
}
|
|
|
}
|
|
|
while ($running);
|
|
|
} while ($running);
|
|
|
|
|
|
// 获取API接口响应的结果
|
|
|
foreach ($urlList as $name => $api) {
|
...
|
...
|
@@ -278,6 +290,18 @@ class Yohobuy |
|
|
}
|
|
|
curl_multi_close($mh);
|
|
|
|
|
|
/* 开启缓存的情况 */
|
|
|
if ($cache) {
|
|
|
// 接口调用异常时, 不害怕,从我们的二级缓存(slave)里再取数据.
|
|
|
if (empty($result)) {
|
|
|
$result = Cache::get($key, 'slave');
|
|
|
}
|
|
|
// 接口调用成功时,这里会设置一级(master)和二级(slave)的缓存数据.
|
|
|
else {
|
|
|
Cache::set($key, $result, $cache);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return $result;
|
|
|
}
|
|
|
|
...
|
...
|
@@ -285,24 +309,51 @@ class Yohobuy |
|
|
* rpc调用远程服务(YAR)
|
|
|
*
|
|
|
* @see http://php.net/manual/zh/yar-client.setopt.php
|
|
|
* @param string $uri
|
|
|
* @param string $method
|
|
|
* @param array $parameters
|
|
|
* @param mixed $cache 控制是否启用接口数据的缓存(时间单位为秒). 如3600表示缓存1小时, false表示不缓存
|
|
|
* @param int $timeout
|
|
|
* @return array
|
|
|
*/
|
|
|
public static function yarClient($uri, $method, $parameters = array(), $timeout = 3000)
|
|
|
public static function yarClient($uri, $method, $parameters = array(), $cache = false, $timeout = 3000)
|
|
|
{
|
|
|
/* 开启缓存的情况 */
|
|
|
if ($cache) {
|
|
|
$key = self::httpBuildQuery($uri . $method, $parameters);
|
|
|
// 先尝试获取一级缓存(master), 有数据则直接返回.
|
|
|
$result = Cache::get($key, 'master');
|
|
|
if (!empty($result)) {
|
|
|
return $result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
$client = new \Yar_Client($uri);
|
|
|
$client->SetOpt(YAR_OPT_PACKAGER, 'php');
|
|
|
$client->SetOpt(YAR_OPT_TIMEOUT, $timeout);
|
|
|
$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, $timeout);
|
|
|
|
|
|
|
|
|
try {
|
|
|
$result = call_user_func_array(array($client, $method), $parameters);
|
|
|
} catch (\Exception $e) {
|
|
|
$result = array();
|
|
|
}
|
|
|
|
|
|
|
|
|
/* 开启缓存的情况 */
|
|
|
if ($cache) {
|
|
|
// 接口调用异常时, 不害怕,从我们的二级缓存(slave)里再取数据.
|
|
|
if (empty($result)) {
|
|
|
$result = Cache::get($key, 'slave');
|
|
|
}
|
|
|
// 接口调用成功时,这里会设置一级(master)和二级(slave)的缓存数据.
|
|
|
else {
|
|
|
Cache::set($key, $result, $cache);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return $result;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 并行(异步)调用远程服务
|
|
|
*
|
...
|
...
|
@@ -322,6 +373,7 @@ class Yohobuy |
|
|
YAR_OPT_CONNECT_TIMEOUT => $timeout
|
|
|
));
|
|
|
}
|
|
|
|
|
|
public static function yarConcurrentLoop($callback = null)
|
|
|
{
|
|
|
\Yar_Concurrent_Client::loop($callback);
|
...
|
...
|
|