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个人网站架设连环讲(二)
Oct 09 PHP
在PHP中使用Sockets 从Usenet中获取文件
Jan 10 PHP
基于php缓存的详解
May 15 PHP
php实现aes加密类分享
Feb 16 PHP
去除php注释和去除空格函数分享
Mar 13 PHP
php调用KyotoTycoon简单实例
Apr 02 PHP
PHP封装的HttpClient类用法实例
Jun 17 PHP
浅谈PHP中JSON数据操作
Jul 01 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 PHP
laravel配置Redis多个库的实现方法
Apr 10 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
phalcon框架使用指南
2016/02/23 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
每个 JavaScript 工程师都应懂的33个概念
2018/10/22 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
node crawler如何添加promise支持
2020/02/01 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
从零学Python之hello world
2014/05/21 Python
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
Python笔记之观察者模式
2019/11/20 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
区分python中的进程与线程
2020/08/13 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
用python读取xlsx文件
2020/12/17 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
先进个人获奖感言
2014/01/24 职场文书
亲子活动总结
2014/04/26 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
元宵节晚会主持词
2015/07/01 职场文书
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers