PHP使用curl_multi实现并发请求的方法示例


Posted in PHP onApril 29, 2018

本文实例讲述了PHP使用curl_multi实现并发请求的方法。分享给大家供大家参考,具体如下:

class CurlMultiUtil {
  /**
  * 根据url,postData获取curl请求对象,这个比较简单,可以看官方文档
  */
  private static function getCurlObject($url,$postData=array(),$header=array()){
    $options = array();
    $url = trim($url);
    $options[CURLOPT_URL] = $url;
    $options[CURLOPT_TIMEOUT] = 3;
    $options[CURLOPT_RETURNTRANSFER] = true;
    foreach($header as $key=>$value){
      $options[$key] =$value;
    }
    if(!empty($postData) && is_array($postData)){
      $options[CURLOPT_POST] = true;
      $options[CURLOPT_POSTFIELDS] = http_build_query($postData);
    }
    if(stripos($url,'https') === 0){
      $options[CURLOPT_SSL_VERIFYPEER] = false;
    }
    $ch = curl_init();
    curl_setopt_array($ch,$options);
    return $ch;
  }
  /**
   * [request description]
   * @param [type] $chList
   * @return [type]
   */
  private static function request($chList){
    $downloader = curl_multi_init();
    // 将三个待请求对象放入下载器中
    foreach ($chList as $ch){
      curl_multi_add_handle($downloader,$ch);
    }
    $res = array();
    // 轮询
    do {
      while (($execrun = curl_multi_exec($downloader, $running)) == CURLM_CALL_MULTI_PERFORM);
      if ($execrun != CURLM_OK) {
        break;
      }
      // 一旦有一个请求完成,找出来,处理,因为curl底层是select,所以最大受限于1024
      while ($done = curl_multi_info_read($downloader)){
        // 从请求中获取信息、内容、错误
        // $info = curl_getinfo($done['handle']);
        $output = curl_multi_getcontent($done['handle']);
        // $error = curl_error($done['handle']);
        $res[] = $output;
        // 把请求已经完成了得 curl handle 删除
        curl_multi_remove_handle($downloader, $done['handle']);
      }
      // 当没有数据的时候进行堵塞,把 CPU 使用权交出来,避免上面 do 死循环空跑数据导致 CPU 100%
      if ($running) {
        $rel = curl_multi_select($downloader, 1);
        if($rel == -1){
          usleep(1000);
        }
      }
      if($running == false){
        break;
      }
    }while(true);
    curl_multi_close($downloader);
    return $res;
  }
  /**
   * [get description]
   * @param [type] $urlArr
   * @return [type]
   */
  public static function get($urlArr){
    $data = array();
    if (!empty($urlArr)) {
      $chList = array();
      foreach ($urlArr as $key => $url) {
        $chList[] = self::getCurlObject($url);
      }
      $data = self::request($chList);
    }
    return $data;
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
Mar 07 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 PHP
php中判断文件空目录是否有读写权限的函数代码
Aug 07 PHP
PHP实现显示照片exif信息的方法
Jul 11 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
PHP中key和current,next的联合运用实例分析
Mar 29 PHP
浅析Yii2中GridView常见操作
Apr 22 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
Nov 05 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
PHP实现限制IP访问的方法
Apr 20 PHP
tp5框架使用composer实现日志记录功能示例
Jan 10 PHP
PHP SESSION机制的理解与实例
Mar 22 PHP
PHP实现转盘抽奖算法分享
Apr 15 #PHP
PHP cURL获取微信公众号access_token的实例
Apr 28 #PHP
详解php与ethereum客户端交互
Apr 28 #PHP
360搜索引擎自动收录php改写方案
Apr 28 #PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 #PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 #PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
Apr 27 #PHP
You might like
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
php日历制作代码分享
2014/01/20 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
JavaScript 撑出页面文字换行
2009/06/15 Javascript
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
security.js实现的RSA加密功能示例
2018/06/06 Javascript
原生js实现公告滚动效果
2021/01/10 Javascript
JS实现图片切换特效
2019/12/23 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[06:36]吞吞映像top1
2014/06/20 DOTA
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
python开发之thread实现布朗运动的方法
2015/11/11 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
幼儿园大班家长评语
2014/04/17 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python
Js类的构建与继承案例详解
2021/09/15 Javascript