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环境――Appserv
Dec 13 PHP
笑谈配置,使用Smarty技术
Jan 04 PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 PHP
解析php中获取url与物理路径的总结
Jun 21 PHP
解析php中的escape函数
Jun 29 PHP
php session_start()出错原因分析及解决方法
Oct 28 PHP
php遍历目录输出目录及其下的所有文件示例
Jan 27 PHP
PHP中常用的转义函数
Feb 28 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
php邮件发送的两种方式
Apr 28 PHP
Yii框架实现图片上传的方法详解
May 20 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 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
7个超级实用的PHP代码片段
2011/07/11 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
js最简单的拖拽效果实现代码
2010/09/24 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
Python实现字典去除重复的方法示例
2017/07/31 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
Python删除n行后的其他行方法
2019/01/28 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
python读取指定字节长度的文本方法
2019/08/27 Python
python分布式编程实现过程解析
2019/11/08 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
社区爱国卫生月活动总结
2014/06/30 职场文书
学校教师安全责任书
2014/07/23 职场文书
作风转变年心得体会
2014/10/22 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
人事文员岗位职责
2015/02/04 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
Linux系统下安装PHP7.3版本
2021/06/26 PHP