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实现jQuery扩展函数
Oct 30 PHP
PHP禁止页面缓存的代码
Oct 23 PHP
基于PHP的简单采集数据入库程序【续篇】
Jul 30 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
ThinkPHP整合百度Ueditor图文教程
Oct 21 PHP
怎样搭建PHP开发环境
Jul 28 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
Nov 15 PHP
php判断邮箱地址是否存在的方法
Feb 13 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 PHP
PHP配置ZendOpcache插件加速
Feb 14 PHP
PHP的new static和new self的区别与使用
Nov 27 PHP
基于PHP的微信公众号的开发流程详解
Aug 07 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
加速XP搜索功能堪比vista
2007/03/22 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
微信支付开发订单查询实例
2016/07/12 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
取选中的radio的值
2010/01/11 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
python基础教程之自定义函数介绍
2014/08/29 Python
python中的多重继承实例讲解
2014/09/28 Python
Python学习教程之常用的内置函数大全
2017/07/14 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
python3 配置logging日志类的操作
2020/04/08 Python
Python网页解析器使用实例详解
2020/05/30 Python
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
Kendra Scott官网:美国领先的时尚配饰品牌
2020/10/22 全球购物
电子信息毕业生自荐信
2013/11/16 职场文书
网络事业创业计划书范文
2014/01/09 职场文书
大学毕业寄语大全
2014/04/10 职场文书
初中生评语大全
2014/04/24 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
法人代表证明书格式
2014/10/01 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
如何利用pygame实现打飞机小游戏
2021/05/30 Python