示例:
*
```
* // 失败时再重试2次
* $curl = new PhalApi_CUrl(2);
*
* // GET
* $rs = $curl->get('http://phalapi.oschina.mopaas.com/Public/demo/?service=Default.Index');
*
* // POST
* $data = array('username' => 'dogstar');
* $rs = $curl->post('http://phalapi.oschina.mopaas.com/Public/demo/?service=Default.Index', $data);
```
*
* @package PhalApi\CUrl
* @license http://www.phalapi.net/license GPL 协议
* @link http://www.phalapi.net/
* @author dogstar 2015-01-02
*/
class PhalApi_CUrl {
/**
* 最大重试次数
*/
const MAX_RETRY_TIMES = 10;
/**
* @var int $retryTimes 超时重试次数;注意,此为失败重试的次数,即:总次数 = 1 + 重试次数
*/
protected $retryTimes;
protected $header = array();
protected $option = array();
/**
* 设置请求头,后设置的会覆盖之前的设置
*
* @param array $header 传入键值对如:
```
* array(
* ['Accept'=>'text/html'],
* ['Connection'=>'keep-alive'],
* )
```
*
* @return $this
*/
public function setHeader( $header )
{
$this->header = array_merge( $this->header, $header);
return $this;
}
/**
* 设置curl配置项
* 1、后设置的会覆盖之前的设置
* 2、开发者设置的会覆盖框架的设置
* @param array $option 格式同上
*
* @return $this
*/
public function setOption( $option )
{
$this->option = array_merge( $this->option, $option);
return $this;
}
/**
* @param int $retryTimes 超时重试次数,默认为1
*/
public function __construct($retryTimes = 1) {
$this->retryTimes = $retryTimes < static::MAX_RETRY_TIMES
? $retryTimes : static::MAX_RETRY_TIMES;
}
/**
* GET方式的请求
* @param string $url 请求的链接
* @param int $timeoutMs 超时设置,单位:毫秒
* @return string 接口返回的内容,超时返回false
*/
public function get($url, $timeoutMs = 3000) {
return $this->request($url, array(), $timeoutMs);
}
/**
* POST方式的请求
* @param string $url 请求的链接
* @param array $data POST的数据
* @param int $timeoutMs 超时设置,单位:毫秒
* @return string 接口返回的内容,超时返回false
*/
public function post($url, $data, $timeoutMs = 3000) {
return $this->request($url, $data, $timeoutMs);
}
/**
*
* @return array
*/
protected function getHeaders() {
$arrHeaders = array();
foreach ($this->header as $key => $val) {
$arrHeaders[] = $key . ':' . $val;
}
return $arrHeaders;
}
/**
* 统一接口请求
* @param string $url 请求的链接
* @param array $data POST的数据
* @param int $timeoutMs 超时设置,单位:毫秒
* @return string 接口返回的内容,超时返回false
*/
protected function request($url, $data, $timeoutMs = 3000) {
$options = array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HEADER => 0,
CURLOPT_CONNECTTIMEOUT_MS => $timeoutMs,
CURLOPT_HTTPHEADER => $this->getHeaders(),
);
if (!empty($data)) {
$options[CURLOPT_POST] = 1;
$options[CURLOPT_POSTFIELDS] = $data;
}
$options = $this->option + $options;//$this->>option优先
$ch = curl_init();
curl_setopt_array( $ch, $options);
$curRetryTimes = $this->retryTimes;
do {
$rs = curl_exec($ch);
$curRetryTimes--;
} while($rs === FALSE && $curRetryTimes >= 0);
curl_close($ch);
return $rs;
}
}