You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

232 lines
7.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace LaneWeChat\Core;
/**
* CURL工具类用于简化HTTP请求操作。
* Class Curl
* Created by Lane.
* @Author: lane
* @Mail: lixuan868686@163.com
* @Date: 14-1-10
* @Time: 下午4:22
* Mail: lixuan868686@163.com
* Website: http://www.lanecn.com
*/
class Curl
{
// 私有静态变量用于存储CURL会话句柄、头部、主体等信息
private static $_ch;
private static $_header;
private static $_body;
// 存储Cookie、选项、URL和Referer的数组
private static $_cookie = array();
private static $_options = array();
private static $_url = array();
private static $_referer = array();
/**
* 调用外部URL支持GET和POST请求。
* @param string $queryUrl 请求的URL
* @param array|string $param 参数
* @param string $method 请求方法,默认为'get'
* @param bool $is_json 是否将返回结果解析为JSON默认为true
* @param bool $is_urlcode 是否对POST参数进行URL编码默认为true
* @return bool|mixed 返回请求结果或false
*/
public static function callWebServer($queryUrl, $param = '', $method = 'get', $is_json = true, $is_urlcode = true)
{
// 检查URL是否为空
if (empty($queryUrl)) {
return false;
}
// 转换方法为小写
$method = strtolower($method);
$ret = '';
// 确保参数是数组
$param = empty($param) ? array() : $param;
// 初始化CURL会话
self::_init();
// 根据请求方法调用相应的私有方法
if ($method == 'get') {
$ret = self::_httpGet($queryUrl, $param);
} elseif ($method == 'post') {
$ret = self::_httpPost($queryUrl, $param, $is_urlcode);
}
// 如果有返回结果根据参数决定是否解析为JSON
if (!empty($ret)) {
if ($is_json) {
return json_decode($ret, true);
} else {
return $ret;
}
}
return false;
}
/**
* 初始化CURL会话
*/
private static function _init()
{
self::$_ch = curl_init();
// 设置CURL选项
curl_setopt(self::$_ch, CURLOPT_HEADER, true);
curl_setopt(self::$_ch, CURLOPT_RETURNTRANSFER, true);
}
/**
* 设置CURL选项
* @param array $optArray 选项数组
*/
public static function setOption($optArray = array())
{
foreach ($optArray as $opt) {
curl_setopt(self::$_ch, $opt['key'], $opt['value']);
}
}
/**
* 关闭CURL会话
* @return bool
*/
private static function _close()
{
if (is_resource(self::$_ch)) {
curl_close(self::$_ch);
}
return true;
}
/**
* 发送GET请求
* @param string $url 请求URL
* @param array $query 查询参数
* @return mixed 请求结果
*/
private static function _httpGet($url, $query = array())
{
// 构建查询字符串
if (!empty($query)) {
$url .= (strpos($url, '?') === false) ? '?' : '&';
$url .= is_array($query) ? http_build_query($query) : $query;
}
// 设置CURL选项
curl_setopt(self::$_ch, CURLOPT_URL, $url);
curl_setopt(self::$_ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(self::$_ch, CURLOPT_HEADER, 0);
// 禁用SSL证书验证
curl_setopt(self::$_ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt(self::$_ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt(self::$_ch, CURLOPT_SSLVERSION, 1);
// 执行请求并返回结果
$ret = self::_execute();
self::_close();
return $ret;
}
/**
* 发送POST请求
* @param string $url 请求URL
* @param array $query 查询参数
* @param bool $is_urlcode 是否进行URL编码
* @return mixed 请求结果
*/
private static function _httpPost($url, $query = array(), $is_urlcode = true)
{
// 对参数进行URL编码
if (is_array($query)) {
foreach ($query as $key => $val) {
if ($is_urlcode) {
$encode_key = urlencode($key);
} else {
$encode_key = $key;
}
if ($encode_key != $key) {
unset($query[$key]);
}
if ($is_urlcode) {
$query[$encode_key] = urlencode($val);
} else {
$query[$encode_key] = $val;
}
}
}
// 设置CURL选项
curl_setopt(self::$_ch, CURLOPT_URL, $url);
curl_setopt(self::$_ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(self::$_ch, CURLOPT_HEADER, 0);
curl_setopt(self::$_ch, CURLOPT_POST, true);
curl_setopt(self::$_ch, CURLOPT_POSTFIELDS, $query);
// 禁用SSL证书验证
curl_setopt(self::$_ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt(self::$_ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt(self::$_ch, CURLOPT_SSLVERSION, 1);
// 执行请求并返回结果
$ret = self::_execute();
self::_close();
return $ret;
}
/**
* 发送PUT请求
* @param string $url 请求URL
* @param array $query 查询参数
* @return mixed 请求结果
*/
private static function _put($url, $query = array())
{
curl_setopt(self::$_ch, CURLOPT_CUSTOMREQUEST, 'PUT');
return self::_httpPost($url, $query);
}
/**
* 发送DELETE请求
* @param string $url 请求URL
* @param array $query 查询参数
* @return mixed 请求结果
*/
private static function _delete($url, $query = array())
{
curl_setopt(self::$_ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
return self::_httpPost($url, $query);
}
/**
* 发送HEAD请求
* @param string $url 请求URL
* @param array $query 查询参数
* @return mixed 请求结果
*/
private static function _head($url, $query = array())
{
curl_setopt(self::$_ch, CURLOPT_CUSTOMREQUEST, 'HEAD');
return self::_httpPost($url, $query);
}
/**
* 执行CURL请求
* @return mixed 请求结果
*/
private static function _execute()
{
$response = curl_exec(self::$_ch);
$errno = curl_errno(self::$_ch);
// 如果发生错误,抛出异常
if ($errno > 0) {
throw new \Exception(curl_error(self::$_ch), $errno);
}
return $response;
}
}
类声明class Curl 定义了一个名为 Curl 的类用于简化HTTP请求操作。
私有静态变量private static $_ch; 等变量用于存储CURL会话句柄、头部、主体等信息。
存储数组private static $_cookie = array(); 等数组用于存储Cookie、选项、URL和Referer等信息。
callWebServer方法用于调用外部URL支持GET和POST请求。根据请求方法调用相应的私有方法并根据参数决定是否解析为JSON。
_init方法初始化CURL会话设置CURL选项。
setOption方法设置CURL选项传入选项数组。
_close方法关闭CURL会话。
_httpGet方法发送GET请求构建查询字符串并设置CURL选项。
_httpPost方法发送POST请求对参数进行URL编码并设置CURL选项。
_put、_delete、_head方法分别用于发送PUT、DELETE和HEAD请求设置相应的CURL选项。
_execute方法执行CURL请求如果发生错误则抛出异常。