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的FTP学习(三)
Oct 09 PHP
谈谈PHP的输入输出流
Feb 14 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
php中导出数据到excel时数字变为科学计数的解决方法
Feb 03 PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 PHP
php实现字符串首字母转换成大写的方法
Mar 17 PHP
php遍历CSV类实例
Apr 14 PHP
Zend Framework自定义Helper类相关注意事项总结
Mar 14 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
thinkPHP实现的省市区三级联动功能示例
May 05 PHP
PHPTree――php快速生成无限级分类
Mar 30 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
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
php分页函数示例代码分享
2014/02/24 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
url参数中有+、空格、=、%、&、#等特殊符号的问题解决
2013/05/15 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
深入理解python中的atexit模块
2017/03/07 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
Python 线程池用法简单示例
2019/10/02 Python
python获取引用对象的个数方式
2019/12/20 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
偷看我的初中毕业鉴定
2014/01/29 职场文书
食品安全处置方案
2014/06/14 职场文书
物理课外活动总结
2014/08/27 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
护理医院见习报告
2014/11/03 职场文书
如何获取numpy array前N个最大值
2021/05/14 Python
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫