zoukankan      html  css  js  c++  java
  • 实用curl类

      1 <?php
      2 
      3 /**
      4  * CURL for http request
      5  */
      6 class LHttpCurl
      7 {
      8     const GET_REQUEST = 'GET';
      9     const POST_REQUEST = 'POST';
     10 
     11 
     12     const RESPONSE_OK_CODE = 200;
     13 
     14     protected $sRequestMethod;
     15     protected $sGateUrl;
     16     protected $sQueryString;
     17     protected $arrProxyOptions;
     18     protected $arrSslOptions;
     19     protected $arrHeaders;
     20     protected $arrCookies;
     21     protected $iTimeout;
     22     protected $iCurlErrno;
     23     protected $sCurlErrMsg;
     24     protected $iResponseCode;
     25     protected $sResponseBody;
     26     protected $arrCurlInfo;
     27 
     28     public function __construct()
     29     {
     30         $this->init();
     31     }
     32 
     33     protected function init()
     34     {
     35         $this->sRequestMethod = self::GET_REQUEST;
     36         $this->sGateUrl = 'http://localhost/cgi';
     37         $this->sQueryString = '';
     38         $this->arrProxyOptions = array();
     39         $this->arrSslOptions = array();
     40         $this->arrHeaders = array();
     41         $this->arrCookies = array();
     42         $this->iTimeout = 3;
     43         $this->iCurlErrno = 0;
     44         $this->sCurlErrMsg = '';
     45         $this->iResponseCode = 0;
     46         $this->sResponseBody = '';
     47         $this->arrCurlInfo = array();
     48     }
     49 
     50     /**
     51      * @param string $requestMethod LHttpClient::GET_REQUEST | LHttpClient::POST_REQUEST
     52      */
     53     public function setMethod($requestMethod)
     54     {
     55         $this->sRequestMethod = $requestMethod;
     56     }
     57 
     58     /**
     59      * @param string $gateUrl 请求接口地址
     60      */
     61     public function setGateURL($gateUrl)
     62     {
     63         $this->init();
     64 
     65         $this->sGateUrl = $gateUrl;
     66     }
     67 
     68     /**
     69      * 设置请求串, 使用http_build_query()生成
     70      * @param string $queryString
     71      */
     72     public function setQueryString($queryString)
     73     {
     74         $this->sQueryString = $queryString;
     75     }
     76 
     77     public function getQueryString()
     78     {
     79         return $this->sQueryString;
     80     }
     81 
     82     /**
     83      * 返回GET形式的请求URL
     84      * @return string 请求URL
     85      */
     86     public function getRequestURL()
     87     {
     88         if (!empty($this->sQueryString))
     89         {
     90             return $this->sGateUrl . '?' . $this->sQueryString;
     91         }
     92         else
     93         {
     94             return $this->sGateUrl;
     95         }
     96     }
     97 
     98     /**
     99      * 设置代理
    100      * @param string $proxyHost CURLOPT_PROXY: "host[:port]"
    101      * @param string $proxyAuth CURLOPT_PROXYUSERPWD: "user:pass"
    102      * @param int $proxyType CURLPROXY_HTTP (default) or CURLPROXY_SOCKS5
    103      * @param int $proxyAuthType CURLAUTH_BASIC and CURLAUTH_NTLM
    104      * @param bool $tunnel CURLOPT_HTTPPROXYTUNNEL: 是否tunnel方式使用代理
    105      */
    106     public function setProxy($proxyHost, $proxyAuth=null,
    107                              $proxyType=null, $proxyAuthType=null,
    108                              $tunnel = false)
    109     {
    110         $this->arrProxyOptions['proxyhost'] = $proxyHost;
    111         $this->arrProxyOptions['proxyauth'] = $proxyAuth;
    112         $this->arrProxyOptions['proxytype'] = $proxyType;
    113         $this->arrProxyOptions['proxyauthtype'] = $proxyAuthType;
    114         $this->arrProxyOptions['tunnel'] = $tunnel;
    115     }
    116 
    117     /**
    118      * 设置证书信息, 证书文件包含了key
    119      * @param string $certFile 证书文件路径(最好使用绝对路径)
    120      * @param string $certPasswd 使用证书或key需要的密码
    121      * @param string $certType "PEM"(默认) | "DER"
    122      */
    123     public function setSslCert($certFile, $certPasswd, $certType="PEM")
    124     {
    125         $this->arrSslOptions['cert'] = $certFile;
    126         $this->arrSslOptions['certtype'] = $certType;
    127         $this->arrSslOptions['certpasswd'] = $certPasswd;
    128     }
    129 
    130     /**
    131      * 设置CA证书路径
    132      * @param string $caFile
    133      */
    134     public function setSslCaInfo($caFile)
    135     {
    136         $this->arrSslOptions['cainfo'] = $caFile;
    137         $this->arrSslOptions['verifypeer'] = true;
    138         $this->arrSslOptions['verifyhost'] = 2;
    139     }
    140 
    141     /**
    142      * 合并$headers到当前请求头
    143      * @param array $headers array('Host' => 'www.xxx.com') : 'Host: www.xxx.com'
    144      */
    145     public function addHeaders($headers)
    146     {
    147         $this->arrHeaders = array_merge($this->arrHeaders, $headers);
    148     }
    149 
    150     /**
    151      * 合并$cookies到当前请求cookie
    152      * @param array $cookies array('fruit' => 'apple', 'colour' => 'red') : 'Cookie: fruit=apple; colour=red'
    153      */
    154     public function addCookies($cookies)
    155     {
    156         $this->arrCookies = array_merge($this->arrCookies, $cookies);
    157     }
    158 
    159     /**
    160      * 设置请求超时
    161      * @param int $timeout
    162      */
    163     public function setTimeout($timeout)
    164     {
    165         $this->iTimeout = $timeout;
    166     }
    167 
    168     /**
    169      * 初始化curl, 发送请求, 记录响应和错误.
    170      *
    171      * @return bool ('http_code' == 200)
    172      */
    173     public function execute()
    174     {
    175 
    176         $ch = curl_init();
    177 
    178         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    179 
    180         if ( $this->sRequestMethod == self::POST_REQUEST ) {
    181             //发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样
    182             curl_setopt($ch, CURLOPT_URL, $this->sGateUrl);
    183             curl_setopt($ch, CURLOPT_POST, true);
    184             curl_setopt($ch, CURLOPT_POSTFIELDS, $this->sQueryString);
    185         } else {
    186             curl_setopt($ch, CURLOPT_URL, $this->getRequestURL());
    187         }
    188 
    189         if ( isset($this->arrProxyOptions['proxyhost']) ) //初始化代理相关设置
    190         {
    191             curl_setopt($ch, CURLOPT_PROXY, $this->arrProxyOptions['proxyhost']);
    192             curl_setopt($ch, CURLOPT_PROXYUSERPWD, $this->arrProxyOptions['proxyauth']);
    193             curl_setopt($ch, CURLOPT_PROXYTYPE, $this->arrProxyOptions['proxytype']);
    194             curl_setopt($ch, CURLOPT_PROXYAUTH, $this->arrProxyOptions['proxyauthtype']);
    195 
    196             curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, $this->arrProxyOptions['tunnel']);
    197         }
    198 
    199         if ( isset($this->arrSslOptions['cert']) ) //初始化ssl证书相关设置
    200         {
    201             curl_setopt($ch, CURLOPT_SSLCERT, $this->arrSslOptions['cert']);
    202             curl_setopt($ch, CURLOPT_SSLCERTTYPE, $this->arrSslOptions['certtype']);
    203             curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $this->arrSslOptions['certpasswd']);
    204         }
    205 
    206         if ( isset($this->arrSslOptions['cainfo']) ) //初始化CA相关设置
    207         {
    208             curl_setopt($ch, CURLOPT_CAINFO, $this->arrSslOptions['cainfo']);
    209             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->arrSslOptions['verifypeer']);
    210             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $this->arrSslOptions['verifyhost']);
    211         } else {
    212             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    213             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    214         }
    215 
    216         //设置Header
    217         if ( !empty($this->arrHeaders) ) {
    218             $headers = array();
    219             foreach ($this->arrHeaders as $key => $value) {
    220                 $headers[] = "$key: $value";
    221             }
    222             curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    223         }
    224 
    225         //设置Cookie
    226         if ( !empty($this->arrCookies) ) {
    227             $cookies = array();
    228             foreach ($this->arrCookies as $key => $value) {
    229                 $encodedValue = urlencode($value);
    230                 $cookies[]    = "$key=$encodedValue";
    231             }
    232             curl_setopt($ch, CURLOPT_COOKIE, implode('; ', $cookies));
    233         }
    234 
    235         // 设置curl允许执行的最长秒数
    236         curl_setopt($ch, CURLOPT_TIMEOUT, $this->iTimeout);
    237 
    238         // 执行操作
    239         $this->sResponseBody = curl_exec($ch);
    240         $this->iCurlErrno    = curl_errno($ch);
    241         $this->sCurlErrMsg   = curl_error($ch);
    242         $this->arrCurlInfo   = curl_getinfo($ch);
    243         $this->iResponseCode = (isset($this->arrCurlInfo['http_code']) ?
    244             intval($this->arrCurlInfo['http_code']) : 0);
    245 
    246         // 释放资源
    247         curl_close($ch);
    248 
    249         //var_dump($this->iResponseCode);
    250 
    251         //return $this->sResponseBody;
    252         return ($this->iResponseCode == 200 ? true : false);
    253     }
    254 
    255     /**
    256      * 返回curl执行的错误码
    257      * @return int curl_errno()
    258      */
    259     public function getCurlErrno()
    260     {
    261         return $this->iCurlErrno;
    262     }
    263 
    264     /**
    265      * 返回curl执行的错误信息
    266      * @return string curl_error()
    267      */
    268     public function getCurlErrMsg()
    269     {
    270         return $this->sCurlErrMsg;
    271     }
    272 
    273     /**
    274      * 返回响应的HTTP Code, 正常返回 200
    275      * @return int
    276      */
    277     public function getResponseCode()
    278     {
    279         return $this->iResponseCode;
    280     }
    281 
    282     /**
    283      * 返回响应内容
    284      * @return string
    285      */
    286     public function getResponseBody()
    287     {
    288         return $this->sResponseBody;
    289     }
    290 
    291     /**
    292      * 返回响应数据
    293      * @return string
    294      */
    295     public function getArrCurlInfo()
    296     {
    297         return $this->arrCurlInfo;
    298     }
    299 
    300 
    301 
    302 }
  • 相关阅读:
    linux --- mysql --- max_allowed_packet
    idea 快捷键
    TypedArray和obtainStyledAttributes使用
    ubuntu中怎样添加或删除一个PPA源
    Ubuntu 14.04 用户安装 Cinnamon 2.2.0
    android-pulltorefresh源码解析(1)--PullToRefreshListView的使用
    Android菜单详解(四)——使用上下文菜单ContextMenu
    Android菜单详解(五)——使用XML生成菜单
    Android菜单详解(二)——创建并响应选项菜单
    Android菜单详解(三)——SubMenu和IconMenu
  • 原文地址:https://www.cnblogs.com/mljun/p/5554562.html
Copyright © 2011-2022 走看看