<?php
|
/**
|
* PhalApi_CUrl CURL请求类
|
*
|
* 通过curl实现的快捷方便的接口请求类
|
*
|
* <br>示例:<br>
|
*
|
```
|
* // 失败时再重试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 <chanzonghuang@gmail.com> 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;
|
}
|
}
|