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.

229 lines
8.1 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请求的发送支持GET、POST等请求方法。
* Class Curl
*/
class Curl {
private static $_ch; // 存储CURL会话句柄
private static $_header;// 存储响应头部信息
private static $_body;// 存储响应主体信息
private static $_cookie = array();// 存储Cookie信息
private static $_options = array();// 存储额外的CURL选项
private static $_url = array ();// 存储URL信息
private static $_referer = array ();// 存储Referer信息
/**
* 调用外部URL
* 根据提供的参数使用GET或POST方法发送请求并返回结果。
* @param string $queryUrl 请求的URL地址
* @param mixed $param 发送的数据,可以是数组或字符串
* @param string $method 请求方法,默认为'get'
* @param bool $is_json 是否期望返回JSON格式的数据
* @param bool $is_urlcode 是否对参数进行URL编码
* @return bool|mixed 请求失败返回false成功则返回解码后的数据或原始数据
*/
public static function callWebServer($queryUrl, $param='', $method='get', $is_json=true, $is_urlcode=true) {
if (empty($queryUrl)) {
return false;// 如果URL为空则直接返回false
}
$method = strtolower($method);
$ret = '';
$param = empty($param) ? array() : $param;
self::_init();
// 根据请求方法,调用对应的私有方法发送请求
if ($method == 'get') {
$ret = self::_httpGet($queryUrl, $param);
} elseif($method == 'post') {
$ret = self::_httpPost($queryUrl, $param, $is_urlcode);
}
if(!empty($ret)){
if($is_json){
return json_decode($ret, true);// 如果期望返回JSON格式的数据则对返回的数据进行JSON解码
}else{
return $ret;// 否则返回原始数据
}
}
return true;// 如果请求成功则返回true
}
/**
* 初始化CURL会话
* 创建一个新的CURL会话并设置一些默认的CURL选项。
*/
private static function _init() {
self::$_ch = curl_init();
curl_setopt(self::$_ch, CURLOPT_HEADER, true);// 设置CURL选项启用响应头和返回传输
curl_setopt(self::$_ch, CURLOPT_RETURNTRANSFER, true);
} // 设置CURL选项使每次请求都是新的连接
// curl_setopt(self::$_ch, CURLOPT_FRESH_CONNECT, true);
/**
* 设置CURL选项
* 允许用户自定义CURL会话的选项。
* @param array $optArray 包含选项的关联数组,其中'key'是CURL选项的常量'value'是对应的值
*/
public static function setOption($optArray=array()) {
foreach($optArray as $opt) {
curl_setopt(self::$_ch, $opt['key'], $opt['value']);
}
}
/**
* 关闭CURL会话
* 释放CURL会话占用的资源。
* @return bool 操作成功返回true
*/
private static function _close() {
if (is_resource(self::$_ch)) {
curl_close(self::$_ch);
}
return true;
}
/**
* 发送GET请求
* 构建并发送一个HTTP GET请求并将响应返回。
* @param string $url 请求的URL地址
* @param array $query 请求参数数组
* @return string 请求的响应内容
*/
private static function _httpGet($url, $query=array()) {
if (!empty($query)) {
$url .= (strpos($url, '?') === false) ? '?' : '&';
$url .= is_array($query) ? http_build_query($query) : $query; // 将数组参数转换为URL参数字符串
}
// 设置CURL选项指定请求的URL
curl_setopt(self::$_ch, CURLOPT_URL, $url);
// 设置CURL选项启用返回传输
curl_setopt(self::$_ch, CURLOPT_RETURNTRANSFER, 1);
// 设置CURL选项不返回响应头
curl_setopt(self::$_ch, CURLOPT_HEADER, 0);
// 设置CURL选项不验证SSL证书
curl_setopt(self::$_ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt(self::$_ch, CURLOPT_SSL_VERIFYHOST, FALSE);
// 设置CURL选项设置SSL版本
curl_setopt(self::$_ch, CURLOPT_SSLVERSION, 1);
// 执行CURL请求并获取响应
$ret = self::_execute();
self::_close();// 关闭CURL会话
return $ret;
}
/**
* 发送POST请求
* 构建并发送一个HTTP POST请求并将响应返回。
* @param string $url 请求的URL地址
* @param array $query 请求参数数组
* @param bool $is_urlcode 是否对参数进行URL编码
* @return string 请求的响应内容
*/
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选项指定请求的URL
curl_setopt(self::$_ch, CURLOPT_URL, $url);
// 设置CURL选项启用返回传输
curl_setopt(self::$_ch, CURLOPT_RETURNTRANSFER, 1);
// 设置CURL选项不返回响应头
curl_setopt(self::$_ch, CURLOPT_HEADER, 0);
// 设置CURL选项启用POST请求
curl_setopt(self::$_ch, CURLOPT_POST, true );
// 设置CURL选项指定POST请求的数据
curl_setopt(self::$_ch, CURLOPT_POSTFIELDS, $query);
// 设置CURL选项不验证SSL证书
curl_setopt(self::$_ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt(self::$_ch, CURLOPT_SSL_VERIFYHOST, FALSE);
// 设置CURL选项设置SSL版本
curl_setopt(self::$_ch, CURLOPT_SSLVERSION, 1);
// 执行CURL请求并获取响应
$ret = self::_execute();
// 关闭CURL会话
self::_close();
return $ret;
}
/**
* 发送PUT请求
* 构建并发送一个HTTP PUT请求并将响应返回。
* @param string $url 请求的URL地址
* @param array $query 请求参数数组
* @return string 请求的响应内容
*/
private static function _put($url, $query = array()) {
// 设置CURL选项指定请求方法为PUT
curl_setopt(self::$_ch, CURLOPT_CUSTOMREQUEST, 'PUT');
return self::_httpPost($url, $query);
}
/**
* 发送DELETE请求
* 构建并发送一个HTTP DELETE请求并将响应返回。
* @param string $url 请求的URL地址
* @param array $query 请求参数数组
* @return string 请求的响应内容
*/
private static function _delete($url, $query = array()) {
// 设置CURL选项指定请求方法为DELETE
curl_setopt(self::$_ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
return self::_httpPost($url, $query);
}
/**
* 发送HEAD请求
* 构建并发送一个HTTP HEAD请求并将响应返回。
* @param string $url 请求的URL地址
* @param array $query 请求参数数组
* @return string 请求的响应内容
*/
private static function _head($url, $query = array()) {
// 设置CURL选项指定请求方法为HEAD
curl_setopt(self::$_ch, CURLOPT_CUSTOMREQUEST, 'HEAD');
return self::_httpPost($url, $query);
}
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;
}
}
// 执行CURL请求
// 执行CURL会话