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 has encountered an Access Violation 错误的解决方法
Jan 17 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
PHP 读取大文件的X行到Y行内容的实现代码
Jun 24 PHP
使用dump函数,给php加断点测试
Jun 25 PHP
PHP 获取文件权限函数介绍
Jul 11 PHP
Zend Studio 实用快捷键一览表(精心整理)
Aug 10 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
PHP中JSON的应用技巧
Oct 10 PHP
PHP连接MYSQL数据库实例代码
Jan 20 PHP
深入浅析用PHP实现MVC
Mar 02 PHP
php仿微信红包分配算法的实现方法
May 13 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 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
一个目录遍历函数
2006/10/09 PHP
php缩小png图片不损失透明色的解决方法
2013/12/25 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
2020/03/03 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
popdiv
2006/07/14 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
JS上传前预览图片实例
2013/03/25 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
详解react-redux插件入门
2018/04/19 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
Windows 安装 Anaconda3+PyCharm的方法步骤
2019/06/13 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
HTML5标签大全
2016/11/23 HTML / CSS
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
2013/02/17 面试题
简历中自我评价怎么写
2014/02/12 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
Python基础之教你怎么在M1系统上使用pandas
2021/05/08 Python