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伪静态页面函数附使用方法
Jun 20 PHP
PHP面向对象法则
Feb 23 PHP
那些年一起学习的PHP(三)
Mar 22 PHP
PHP递归返回值时出现的问题解决办法
Feb 19 PHP
PHP使用memcache缓存技术提高响应速度的方法
Dec 26 PHP
微信access_token的获取开发示例
Apr 16 PHP
PHP实现的构造sql语句类实例
Feb 03 PHP
46 个非常有用的 PHP 代码片段
Feb 16 PHP
thinkPHP中volist标签用法示例
Dec 06 PHP
yii插入数据库防并发的简单代码
May 27 PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 PHP
tp5.1 实现setInc字段自动加1
Oct 18 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 远程图片保存到本地的函数类
2008/12/08 PHP
php字符串操作常见问题小结
2016/10/11 PHP
Yii2框架自定义验证规则操作示例
2019/02/08 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
Python温度转换实例分析
2018/01/17 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
django中related_name的用法说明
2020/05/20 Python
Python 中Operator模块的使用
2021/01/30 Python
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
智能钱包:Ekster
2019/11/21 全球购物
公司门卫工作职责
2014/06/28 职场文书
联片教研活动总结
2014/07/01 职场文书
党风廉正建设责任书
2015/01/29 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python