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 相关文章推荐
PHP5/ZendEngine2的改进
Oct 09 PHP
投票管理程序
Oct 09 PHP
PHP验证码类代码( 最新修改,完全定制化! )
Dec 02 PHP
php中simplexml_load_string使用实例分享
Feb 13 PHP
跟我学Laravel之视图 & Response
Oct 15 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP多个图片压缩成ZIP的方法
Aug 18 PHP
详解php用static方法的原因
Sep 12 PHP
php测试kafka项目示例
Feb 06 PHP
PHP7生产环境队列Beanstalkd用法详解
May 19 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
人族 TERRAN 概述
2020/03/14 星际争霸
用文本文件制作留言板提示(上)
2006/10/09 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
php验证session无效的解决方法
2014/11/04 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
一个小时快速搭建微信小程序的方法步骤
2019/04/15 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
python定时执行指定函数的方法
2015/05/27 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
python定时关机小脚本
2018/06/20 Python
对python实现合并两个排序链表的方法详解
2019/01/23 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
个人求职信范例
2014/01/29 职场文书
亲属关系公证书
2014/04/08 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
销售代理协议书
2014/09/30 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL