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 }