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 相关文章推荐
使用无限生命期Session的方法
Oct 09 PHP
PHP4实际应用经验篇(8)
Oct 09 PHP
dedecms 制作模板中使用的全局标记图文教程
Mar 11 PHP
探讨GDFONTPATH能否被winxp下的php支持
Jun 21 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
自己写的php curl库实现整站克隆功能
Feb 12 PHP
PHP网站开发中常用的8个小技巧
Feb 13 PHP
PHP中addcslashes与stripcslashes函数用法分析
Jan 07 PHP
php数组冒泡排序算法实例
May 06 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
Thinkphp5.0框架视图view的循环标签用法示例
Oct 12 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 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 sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
几个有趣的Javascript Hack
2010/07/24 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
创建一般js对象的几种方式
2017/01/19 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
档案接收函
2014/01/13 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
资产运营委托书范本
2014/10/16 职场文书
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS
总结Python连接CS2000的详细步骤
2021/06/23 Python
基于PyQt5制作一个群发邮件工具
2022/04/08 Python
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL