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 相关文章推荐
MySQL GBK→UTF-8编码转换
May 24 PHP
PHP计数器的实现代码
Jun 08 PHP
修改php.ini以达到屏蔽错误信息并记录日志
Jun 16 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
thinkphp使用phpmailer发送邮件的方法
Nov 24 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
php版阿里云OSS图片上传类详解
Dec 01 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
Jun 08 PHP
深入理解PHP中mt_rand()随机数的安全
Oct 12 PHP
PHP快速排序算法实现的原理及代码详解
Apr 03 PHP
php实现图片压缩处理
Sep 09 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 for 循环语句使用方法详细说明
2010/05/09 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
JavaScript 图片预览效果 推荐
2009/12/22 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
Python中的__slots__示例详解
2017/07/06 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
keras topN显示,自编写代码案例
2020/07/03 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
C#面试问题
2016/07/29 面试题
人力资源行政经理自我评价
2013/10/23 职场文书
本科毕业生的求职信范文
2013/11/20 职场文书
银行职员思想汇报
2013/12/31 职场文书
法律六进活动方案
2014/03/13 职场文书
求职意向书
2014/04/01 职场文书
务虚会发言材料
2014/12/25 职场文书
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers