设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间05 现在时间05 缓存数据 许嵩你要为了你那句:上得厅堂也下得厨房,就像我一直在找的姑娘,而努力的姑娘负责啊。

许嵩你要为了你那句:上得厅堂也下得厨房,就像我一直在找的姑娘,而努力的姑娘负责啊。 -- 雅俗共赏

查看: 652|回复: 5

PHP实现的CURL非阻塞调用类

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:220
  • 打卡月天数:0
  • 打卡总奖励:3305
  • 最近打卡:2025-06-25 18:55:13
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
414
主题
376
精华
0
金钱
4517
积分
837
注册时间
2023-1-5
最后登录
2025-6-25

发表于 2023-2-13 01:05:39 | 显示全部楼层 |阅读模式
本文实例讲述了PHP实现的CURL非阻塞调用类。分享给大家供大家参考,具体如下:
前面一篇《PHP实现非阻塞模式的方法》文章讲述了PHP中实现非阻塞模式,其实如果只是HTTP的话,直接用CURL就能实现。
基于网上的一段代码,修改完善后封装了一个支持POST/GET的非阻塞调用类。
欢迎测试bug~~~~~
  1. /*****************************************************
  2. CURL 非阻塞调用类
  3. Auther: Linvo
  4. Copyright(C) 2010/10/21
  5. *******************************************************/
  6. /*
  7.   // 使用范例
  8.   // 传入参数说明
  9.   // url 请求地址
  10.   // data POST方式数据
  11.   //并发调用
  12.   $param1 = array(
  13.       array(
  14.         'url' => "http://localhost/a.php?s=1",
  15.         ),
  16.       array(
  17.         'url' => "http://localhost/a.php?s=1",
  18.         'data' => array('aaa' => 1, 'bbb' => 2),
  19.         ),
  20.       );
  21.   //单个调用
  22.   $param2 = array(
  23.       'url' => "http://localhost/a.php?s=0",
  24.       'data' => array('aaa' => 1, 'bbb' => 2),
  25.       );
  26.   //单个调用(GET简便方式)
  27.   $param3 = 'http://localhost/a.php?s=2';
  28.   $ac = new AsyncCURL();
  29.   $ac->set_param($param1);
  30.   $ret = $ac->send();
  31.   //返回值为请求参数顺序的结果数组(元素值为False表示请求错误)
  32.   var_dump($ret);
  33. */
  34. class AsyncCURL
  35. {
  36.   /**
  37.    * 是否需要返回HTTP头信息
  38.    */
  39.   public $curlopt_header = 0;
  40.   /**
  41.    * 单个CURL调用超时限制
  42.    */
  43.   public $curlopt_timeout = 20;
  44.   private $param = array();
  45.   /**
  46.    * 构造函数(可直接传入请求参数)
  47.    *
  48.    * @param array 可选
  49.    * @return void
  50.    */
  51.   public function __construct($param = False)
  52.   {
  53.     if ($param !== False)
  54.     {
  55.       $this->param = $this->init_param($param);
  56.     }
  57.   }
  58.   /**
  59.    * 设置请求参数
  60.    *
  61.    * @param array
  62.    * @return void
  63.    */
  64.   public function set_param($param)
  65.   {
  66.     $this->param = $this->init_param($param);
  67.   }
  68.   /**
  69.    * 发送请求
  70.    *
  71.    * @return array
  72.    */
  73.   public function send()
  74.   {
  75.     if(!is_array($this->param) || !count($this->param))
  76.     {
  77.       return False;
  78.     }
  79.     $curl = $ret = array();
  80.     $handle = curl_multi_init();
  81.     foreach ($this->param as $k => $v)
  82.     {
  83.       $param = $this->check_param($v);
  84.       if (!$param) $curl[$k] = False;
  85.       else $curl[$k] = $this->add_handle($handle, $param);
  86.     }
  87.     $this->exec_handle($handle);
  88.     foreach ($this->param as $k => $v)
  89.     {
  90.       if ($curl[$k])
  91.       {
  92.         $ret[$k] = curl_multi_getcontent($curl[$k]);
  93.         curl_multi_remove_handle($handle, $curl[$k]);
  94.       } else {
  95.         $ret[$k] = False;
  96.       }
  97.     }
  98.     curl_multi_close($handle);
  99.     return $ret;
  100.   }
  101.   //以下为私有方法
  102.   private function init_param($param)
  103.   {
  104.     $ret = False;
  105.     if (isset($param['url']))
  106.     {
  107.       $ret = array($param);
  108.     } else {
  109.       $ret = isset($param[0]) ? $param : False;
  110.     }
  111.     return $ret;
  112.   }
  113.   private function check_param($param = array())
  114.   {
  115.     $ret = array();
  116.     if (is_string($param))
  117.     {
  118.       $url = $param;
  119.     } else {
  120.       extract($param);
  121.     }
  122.     if (isset($url))
  123.     {
  124.       $url = trim($url);
  125.       $url = stripos($url, 'http://') === 0 ? $url : NULL;
  126.     }
  127.     if (isset($data) && is_array($data) && !empty($data))
  128.     {
  129.       $method = 'POST';
  130.     } else {
  131.       $method = 'GET';
  132.       unset($data);
  133.     }
  134.     if (isset($url)) $ret['url'] = $url;
  135.     if (isset($method)) $ret['method'] = $method;
  136.     if (isset($data)) $ret['data'] = $data;
  137.     $ret = isset($url) ? $ret : False;
  138.     return $ret;
  139.   }
  140.   private function add_handle($handle, $param)
  141.   {
  142.     $curl = curl_init();
  143.     curl_setopt($curl, CURLOPT_URL, $param['url']);
  144.     curl_setopt($curl, CURLOPT_HEADER, $this->curlopt_header);
  145.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  146.     curl_setopt($curl, CURLOPT_TIMEOUT, $this->curlopt_timeout);
  147.     if ($param['method'] == 'POST')
  148.     {
  149.       curl_setopt($curl, CURLOPT_POST, 1);
  150.       curl_setopt($curl, CURLOPT_POSTFIELDS, $param['data']);
  151.     }
  152.     curl_multi_add_handle($handle, $curl);
  153.     return $curl;
  154.   }
  155.   private function exec_handle($handle)
  156.   {
  157.     $flag = null;
  158.     do {
  159.       curl_multi_exec($handle, $flag);
  160.     } while ($flag > 0);
  161.   }
  162. }
复制代码
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php curl用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》及《PHP中json格式数据操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
16
积分
12
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2023-3-27 09:16:13 | 显示全部楼层
看看~~~~学习学习~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:常驻代表
  • 打卡总天数:34
  • 打卡月天数:0
  • 打卡总奖励:438
  • 最近打卡:2025-06-30 16:25:59
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
495
积分
70
注册时间
2023-1-1
最后登录
2025-6-30

发表于 2023-4-2 01:33:40 | 显示全部楼层
感谢分享~~~~学习学习~~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
12
积分
4
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2023-5-5 01:23:03 | 显示全部楼层
免费分享的大佬,反手就是一个赞~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:12
  • 最近打卡:2024-08-05 05:22:19
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
26
积分
4
注册时间
2023-10-23
最后登录
2024-8-5

发表于 2024-4-11 08:24:44 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2025-4-9 05:24:41 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼
6楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表