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 相关文章推荐
支持oicq头像的留言簿(一)
Oct 09 PHP
dedecms模板标签代码官方参考
Mar 17 PHP
PHP类中Static方法效率测试代码
Oct 17 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 PHP
PHP实现模仿socket请求返回页面的方法
Nov 04 PHP
typecho插件编写教程(六):调用接口
May 28 PHP
PHP中list()函数用法实例简析
Jan 08 PHP
Yii框架连接mongodb数据库的代码
Jul 27 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
PHP写API输出的时用echo的原因详解
Apr 28 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 10 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
可以在线执行PHP代码包装修正版
2008/03/15 PHP
PHP原理之异常机制深入分析
2010/08/08 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
Python生成不重复随机值的方法
2015/05/11 Python
python 调用HBase的简单实例
2016/12/18 Python
numpy自动生成数组详解
2017/12/15 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
Python操作Jira库常用方法解析
2020/04/10 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
小学生竞选班长演讲稿
2014/04/24 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
党员四风剖析材料
2014/08/27 职场文书
秋冬农业生产标语
2014/10/09 职场文书