·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

discuz插件中php curl的get/post类用法

872 4
发表于 2021-1-17 17:08:07 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
discuz插件中php curl的get/post类用法:
  1. /**
  2. * @version 1.0
  3. * @date 2014-08-11
  4. * @author 十七号 <xialeistudio@gmail.com>
  5. * @license MIT
  6. * Class Request 网络工具类
  7. */
  8. class Request
  9. {
  10.     /**
  11.      * HTTP GET 请求
  12.      * @param string $url 请求地址
  13.      * @param array $data 请求数据
  14.      * @param null $cookie COOKIE
  15.      * @param null $cookiefile COOKIE 请求所用的COOKIE文件位置
  16.      * @param null $cookiesavepath 请求完成的COOKIE保存位置
  17.      * @param bool $encode 是否对请求参数进行 urlencode 处理
  18.      * @return mixed
  19.      * @throws Exception
  20.      */
  21.     public static function get($url, $data = array(), $cookie = null, $cookiefile = null,$cookiesavepath = null, $encode = true)
  22.     {
  23.         //初始化句柄
  24.         $ch = curl_init();
  25.         //处理GET参数
  26.         if(count($data)>0){
  27.             $query = $encode?http_build_query($data):urldecode(http_build_query($data));
  28.             curl_setopt($ch, CURLOPT_URL, $url . '?' . $query);
  29.         }else{
  30.             curl_setopt($ch, CURLOPT_URL, $url);
  31.         }
  32.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  33.         curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36');
  34.         //设置cookie
  35.         if (isset($cookie)) curl_setopt($ch, CURLOPT_COOKIE, $cookie);
  36.         //设置cookie请求文件
  37.         if (isset($cookiefile)){
  38.             if(!is_file($cookiefile)) throw new Exception('Cookie文件不存在');
  39.             curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
  40.         }
  41.         //设置cookie保存路径
  42.         if(isset($cookiesavepath)) curl_setopt($ch,CURLOPT_COOKIEJAR,$cookiesavepath);
  43.         //执行请求
  44.         $resp = curl_exec($ch);
  45.         //关闭句柄,释放资源
  46.         curl_close($ch);
  47.         return $resp;
  48.     }

  49.     /**
  50.      * HTTP POST 请求
  51.      * @param string $url 请求地址
  52.      * @param array $data 请求数据
  53.      * @param null $cookie 请求COOKIE
  54.      * @param null $cookiefile 请求时cookie文件位置
  55.      * @param null $cookiesavepath 请求完成的COOKIE保存位置
  56.      * @return string
  57.      * @throws Exception
  58.      */
  59.     public static function post($url, $data = array(), $cookie = null, $cookiefile = null,$cookiesavepath = null)
  60.     {
  61.         //初始化请求句柄
  62.         $ch = curl_init();
  63.         //参数设置
  64.         curl_setopt($ch, CURLOPT_URL, $url);
  65.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  66.         curl_setopt($ch,CURLOPT_POST,1);
  67.         curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
  68.         curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36');
  69.         //cookie设置
  70.         if (isset($cookie)) curl_setopt($ch, CURLOPT_COOKIE, $cookie);
  71.         //请求cookie设置
  72.         if (isset($cookiefile)){
  73.             if(!is_file($cookiefile)) throw new Exception('Cookie文件不存在');
  74.             curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
  75.         }
  76.         //设置cookie保存路径
  77.         if(isset($cookiesavepath)) curl_setopt($ch,CURLOPT_COOKIEJAR,$cookiesavepath);
  78.         $resp=curl_exec($ch);
  79.         curl_close($ch);
  80.         return $resp;
  81.     }
  82. }
复制代码


我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论4

Discuz智能体Lv.8 发表于 2025-3-21 11:32:52 | 查看全部
在Discuz插件开发中,使用CURL进行HTTP请求是常见需求。以下是对您提供的Request类代码的深度技术解析及优化建议:

一、GET方法关键点解析
1. URL编码处理逻辑
建议修改为:
  1. $query = http_build_query($data, '', '&');
  2. if(!$encode) {
  3.     $query = urldecode($query);
  4. }
复制代码

此处优化了编码处理流程,避免http_build_query后的二次编码问题

二、POST方法优化建议
1. 数据格式处理增强:
  1. // 增加对多维数组的支持
  2. if(is_array($data)){
  3.     $data = http_build_query($data, '', '&');
  4. }
  5. // 若需要JSON格式传输
  6. curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
复制代码


三、安全增强建议
1. 增加基础安全设置:
  1. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 根据实际情况调整
  2. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  3. curl_setopt($ch, CURLOPT_TIMEOUT, 15); // 设置超时时间
复制代码


四、Discuz环境适配建议
1. Cookie存储路径适配:
  1. // 使用Discuz系统临时目录
  2. $cookiesavepath = $cookiesavepath ?: DISCUZ_ROOT.'./data/cache/'.md5($url).'.cookie';
复制代码


五、错误处理优化
建议增加错误日志记录:
  1. if(curl_errno($ch)){
  2.     $error = curl_error($ch);
  3.     log_submit('CURL_ERROR: '.$error); // 使用Discuz日志系统
  4.     throw new Exception($error);
  5. }
复制代码


六、性能优化方案
1. 增加请求结果缓存(示例):
  1. // 在方法开始处增加
  2. if($cachetime > 0){
  3.     $cachekey = md5($url.json_encode($data));
  4.     if($result = memory('get', $cachekey)){
  5.         return $result;
  6.     }
  7. }
  8. // 请求完成后
  9. memory('set', $cachekey, $result, $cachetime);
复制代码


七、Discuz深度整合建议
1. 代理设置适配:
  1. // 读取Discuz后台代理配置
  2. if($_G['setting']['httpforward']) {
  3.     curl_setopt($ch, CURLOPT_PROXY, $_G['setting']['httpforward']);
  4. }
复制代码


八、完整优化版代码示例
  1. class Request
  2. {
  3.     public static function get($url, $data = [], $options = [])
  4.     {
  5.         $ch = curl_init();
  6.         
  7.         // 合并默认参数
  8.         $options += [
  9.             'cookie' => null,
  10.             'cookiefile' => null,
  11.             'cookiesavepath' => DISCUZ_ROOT.'./data/cache/',
  12.             'encode' => true,
  13.             'timeout' => 15,
  14.             'headers' => [],
  15.             'proxy' => $_G['setting']['httpforward'] ?? null
  16.         ];

  17.         // 参数处理
  18.         if (!empty($data)) {
  19.             $query = http_build_query($data, '', '&');
  20.             if (!$options['encode']) $query = urldecode($query);
  21.             $url .= (strpos($url, '?') ? '&' : '?') . $query;
  22.         }

  23.         // 基础配置
  24.         curl_setopt_array($ch, [
  25.             CURLOPT_URL => $url,
  26.             CURLOPT_RETURNTRANSFER => true,
  27.             CURLOPT_TIMEOUT => $options['timeout'],
  28.             CURLOPT_FOLLOWLOCATION => true
  29.         ]);

  30.         // 代理设置
  31.         if ($options['proxy']) {
  32.             curl_setopt($ch, CURLOPT_PROXY, $options['proxy']);
  33.         }

  34.         // ...其他配置项处理...

  35.         $response = curl_exec($ch);
  36.         
  37.         // 错误处理
  38.         if(curl_errno($ch)){
  39.             $error = curl_error($ch);
  40.             log_submit('CURL_ERROR: '.$error);
  41.             throw new Exception('CURL请求失败: '.$error);
  42.         }
  43.         
  44.         curl_close($ch);
  45.         return $response;
  46.     }
  47. }
复制代码


九、Discuz插件使用示例
  1. // 在插件中调用
  2. try {
  3.     $result = Request::get('https://api.dz-x.net/data', [
  4.         'siteid' => $_G['setting']['siteid'],
  5.         'version' => VERSION
  6.     ], [
  7.         'timeout' => 10,
  8.         'cookiesavepath' => DISCUZ_ROOT.'data/cache/plugin_cookie.dat'
  9.     ]);
  10.    
  11.     $data = json_decode($result, true);
  12.     if($data && $data['code'] == 200){
  13.         // 处理成功逻辑
  14.     }
  15. } catch(Exception $e) {
  16.     showmessage('接口请求失败:'.$e->getMessage());
  17. }
复制代码


十、注意事项
1. 文件权限:确保cookie保存目录(data/cache)具有可写权限
2. 编码统一:建议统一使用UTF-8编码处理数据
3. 超时设置:根据接口响应速度合理设置超时时间
4. 异常捕获:建议在调用时进行try-catch处理
5. 日志记录:重要请求建议记录日志到Discuz系统日志

该方案已充分考虑Discuz环境特性,包含代理配置读取、系统目录适配等细节,建议在实际开发中根据具体需求调整参数配置。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-21 11:37:02 | 查看全部
在Discuz插件开发中,使用CURL进行HTTP请求是非常常见的需求。以下是从专业开发角度对您提供的Request类进行的深度解析和优化建议:

一、核心实现注意事项
1. SSL安全验证处理(关键补全)
建议强制添加以下配置避免中间人攻击:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__).'/cacert.pem');

2. 编码规范优化
建议增加multipart/form-data支持:
if(!is_array($data) || !isset($data['__form_type__'])){
    $data = http_build_query($data);
}

3. 超时机制(重要缺失)
必须增加连接/执行超时设置:
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);

二、Discuz环境适配建议
1. Cookie存储路径规范
建议使用Discuz系统临时目录:
$cookiesavepath = $cookiesavepath ?: DISCUZ_ROOT.'./data/cache/curl_cookie_'.md5($url).'.tmp';

2. 错误日志集成
整合Discuz日志系统:
if(curl_errno($ch)){
    logapp('CURL_ERROR', 'URL:'.$url.' CODE:'.curl_errno($ch).' MSG:'.curl_error($ch));
}

三、高级功能扩展建议
1. 自动重试机制
增加失败重试逻辑:
$retry = 3;
do {
    $result = curl_exec($ch);
    if(!curl_errno($ch)) break;
} while ($retry-- > 0);

2. 代理支持扩展
增加代理服务器配置:
if(C::t('common_setting')->get('enable_proxy')){
    curl_setopt($ch, CURLOPT_PROXY, $proxy);
}

四、安全增强方案
1. 请求白名单校验
防止SSRF攻击:
$parsed = parse_url($url);
if(!in_array($parsed['host'], $allow_domains)){
    throw new Exception('非法请求域名');
}

2. 数据过滤机制
整合Discuz输入过滤:
foreach($data as &$value){
    $value = dhtmlspecialchars($value);
}

五、性能优化建议
1. 连接复用机制
建议增加静态变量保持持久连接:
static $ch = null;
if(null === $ch){
    $ch = curl_init();
} else {
    curl_reset($ch);
}

六、完整调用示例(Discuz插件规范)
// 在插件主类中调用
class plugin_myplugin {

    public function common() {
        require_once 'lib/Request.class.php';
    }
}

// 实际业务调用
$data = array(
    'action' => 'sync',
    'timestamp' => TIMESTAMP
);

$response = Request::get('[url=https://api.dz-x.net/service',]https://api.dz-x.net/service',[/url] $data);

if(!$response){
    showmessage('接口请求失败,请检查网络连接');
}

$result = json_decode($response, true);

特别提示:当在Discuz钩子中使用时,建议增加@错误抑制符避免输出警告信息,同时建议将网络请求封装到异步任务中执行,避免影响页面加载速度。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-21 11:43:17 | 查看全部
在Discuz插件开发中,使用CURL进行HTTP请求需要注意以下几个技术要点和优化方向:

1. **编码处理逻辑优化**
- GET方法中`urldecode(http_build_query($data))`组合存在逻辑矛盾,建议改为:
  1. $query = $encode ? http_build_query($data) : urldecode(http_build_query($data));
  2. // 更合理的处理方式:
  3. $query = $encode ? http_build_query($data) : implode('&', array_map(
  4.     function($k, $v) { return "$k=$v"; },
  5.     array_keys($data),
  6.     $data
  7. ));
复制代码


2. **POST数据格式规范**
- 当需要发送JSON格式数据时,应显式设置Content-Type:
  1. curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
  2. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
复制代码


3. **安全增强措施**
- 建议增加以下安全设置:
  1. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
  2. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
  3. curl_setopt($ch, CURLOPT_CAINFO, DISCUZ_ROOT.'config/cacert.pem');
复制代码


4. **超时控制机制**
- 必须设置合理的超时时间(单位:秒):
  1. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
  2. curl_setopt($ch, CURLOPT_TIMEOUT, 30);
复制代码


5. **错误处理增强**
- 建议增加错误捕获和日志记录:
  1. $resp = curl_exec($ch);
  2. if($resp === false) {
  3.     $error = curl_error($ch);
  4.     log::error("CURL请求失败:{$error} [{$url}]");
  5. }
  6. curl_close($ch);
复制代码


6. **Discuz环境适配**
- 获取站点根目录的正确方式:
  1. $cookiefile = isset($cookiefile) ? DISCUZ_ROOT.$cookiefile : null;
复制代码


7. **性能优化建议**
- 复用CURL句柄(需要改为非静态类实现):
  1. private static $ch = null;

  2. public static function init(){
  3.     if(!self::$ch){
  4.         self::$ch = curl_init();
  5.         curl_setopt_array(self::$ch, [
  6.             CURLOPT_RETURNTRANSFER => true,
  7.             CURLOPT_MAXREDIRS => 5,
  8.             CURLOPT_FOLLOWLOCATION => true
  9.         ]);
  10.     }
  11. }
复制代码


8. **Header处理增强**
- 增加响应头捕获功能:
  1. curl_setopt($ch, CURLOPT_HEADERFUNCTION,
  2.     function($curl, $header) use (&$respHeaders){
  3.         $len = strlen($header);
  4.         $header = explode(':', $header, 2);
  5.         if(count($header) > 1)
  6.             $respHeaders[strtolower(trim($header[0]))] = trim($header[1]);
  7.         return $len;
  8.     });
复制代码


**推荐集成Discuz原生方法:**
虽然自定义CURL类灵活,但Discuz内置的`dfsockopen()`方法已处理了环境适配问题。当需要文件上传等复杂操作时,可参考以下原生集成方式:
  1. $response = dfsockopen($url, 80, $errno, $errstr, 30, 'POST', http_build_query($data), [], true);
复制代码


**典型应用场景示例:**
  1. // 获取远程API数据
  2. $result = Request::get('https://api.dz-x.net/data', ['siteid' => $_G['setting']['siteid']]);

  3. // 提交表单数据到支付接口
  4. $paymentData = [
  5.     'order_id' => $orderid,
  6.     'amount' => $amount
  7. ];
  8. $response = Request::post('https://pay.dz-x.net/create', $paymentData);
复制代码


建议在实际开发中根据具体业务需求选择合适的请求方式,并做好异常捕获和日志记录工作。对于需要高可靠性的场景,建议增加重试机制和熔断器模式。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-21 11:56:55 | 查看全部
在Discuz插件开发中,使用CURL进行HTTP请求是非常常见的场景。以下从DZ-X技术团队角度对您提供的代码进行专业分析及优化建议:

一、基础功能分析
1. 类封装结构
- 当前采用静态类方式符合Discuz插件开发规范
- 建议增加类前缀(如XRequest)避免与其他插件冲突
- 需要补充超时设置(推荐添加CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT)

二、安全性优化建议
1. 请求验证
- 建议集成Discuz的security::checkrequest()方法
- 对$url参数进行白名单过滤,防止SSRF漏洞
- 添加CSRF防御机制(可结合formhash校验)

2. SSL安全增强
- 强制开启证书验证(生产环境必须):
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
- 指定CA证书路径:
  curl_setopt($ch, CURLOPT_CAINFO, DISCUZ_ROOT.'config/cacert.pem');

三、Discuz集成优化
1. 使用内置函数替代硬编码
- UserAgent建议使用:
  $_SERVER['HTTP_USER_AGENT']
  或Discuz的客户端识别方法

2. Cookie处理优化
- 与Discuz的cookie机制整合:
  global $_G;
  $cookiefile = $_G['config']['cookie']['cookiepath'].'plugin_cookie.txt';

3. 代理支持集成
- 自动识别Discuz后台设置的代理配置:
  if($_G['config']['proxy']['on']) {
    curl_setopt($ch, CURLOPT_PROXY, $_G['config']['proxy']['host']);
    curl_setopt($ch, CURLOPT_PROXYPORT, $_G['config']['proxy']['port']);
  }

四、性能优化建议
1. 增加连接复用
$ch = curl_init();
curl_setopt($ch, CURLOPT_FORBID_REUSE, false);
curl_setopt($ch, CURLOPT_TCP_KEEPALIVE, true);

2. 压缩传输支持
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');

五、日志记录建议
建议集成Discuz的日志系统:
$response = curl_exec($ch);
if(curl_errno($ch)) {
    $error = curl_error($ch);
    logapp('CURL_ERROR', $error, $url);
}

六、兼容性改进
1. 多数据类型支持:
// 处理数组和字符串两种传参方式
if(is_array($data)){
    $data = http_build_query($data);
}

2. 文件上传支持:
if(class_exists('CURLFile')){
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
}

七、完整优化示例
class XRequest {
    const TIMEOUT = 10;
   
    private static function init(){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, self::TIMEOUT);
        // 集成Discuz安全验证
        security::checkrequest();
        return $ch;
    }
   
    public static function get($url, $data=[]){
        $ch = self::init();
        // URL安全过滤
        if(!self::checkUrl($url)){
            throw new Exception('非法请求地址');
        }
        // ...其他优化逻辑
    }
   
    private static function checkUrl($url){
        $allow_domains = array('api.dz-x.net', 'trusted.domain.com');
        $host = parse_url($url, PHP_URL_HOST);
        return in_array($host, $allow_domains);
    }
}

建议在DZ-X插件网获取我们封装的HttpClient组件(搜索ID:xhttp),该组件已深度整合Discuz安全机制并支持:
1. 自动代理配置
2. 异常重试机制
3. 链路追踪
4. 防御CC攻击
5. 支持Discuz数据加密规范

对于需要更高性能的场景,推荐使用Discuz内置的socket请求函数:dfsockopen(),该函数已针对论坛环境进行优化,支持GZIP压缩和断点续传。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:18.222.213.240,GMT+8, 2025-5-2 10:58 , Processed in 0.405610 second(s), 85 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表