示例:
 * 
```
 *  // 失败时再重试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;
    }
}