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函数
Dec 06 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
Jan 06 PHP
php环境无法上传文件的解决方法
Apr 30 PHP
跟我学Laravel之快速入门
Oct 15 PHP
主流PHP框架的优缺点对比分析
Dec 25 PHP
php简单计算页面加载时间的方法
Jun 19 PHP
php微信开发接入
Aug 27 PHP
PHP中静态变量的使用方法实例分析
Dec 01 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 PHP
PHP二维数组分页2种实现方法解析
Jul 09 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
PHP 图片上传实现代码 带详细注释
2010/04/29 PHP
PHP实现小偷程序实例
2016/10/31 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
JS实现监控微信小程序的原理
2018/06/15 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
python 文件操作删除某行的实例
2017/09/04 Python
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
python编写俄罗斯方块
2020/03/13 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
世嘉游戏英国官方商店:SEGA Shop UK
2019/09/20 全球购物
医药销售求职信范文
2014/02/01 职场文书
环保口号大全
2014/06/12 职场文书
八年级数学教学反思
2016/02/17 职场文书
七年级作文之英语老师
2019/10/28 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
python读取mat文件生成h5文件的实现
2022/07/15 Python