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 相关文章推荐
用文本作数据处理
Oct 09 PHP
PHP配置文件中最常用四个ini函数
Mar 19 PHP
攻克CakePHP系列一 连接MySQL数据库
Oct 22 PHP
php 中英文语言转换类
Sep 07 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
Dec 29 PHP
Linux环境下搭建php开发环境的操作步骤
Jun 17 PHP
解析:使用php mongodb扩展时 需要注意的事项
Jun 18 PHP
php实例分享之mysql数据备份
May 19 PHP
PHP中如何使用session实现保存用户登录信息
Oct 20 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
Sep 28 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
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
js原生跨域_用script标签的简单实现
2016/09/24 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
2013/11/27 Python
Python解释执行原理分析
2014/08/22 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
Python科学计算包numpy用法实例详解
2018/02/08 Python
python删除服务器文件代码示例
2018/02/09 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
学校采购员岗位职责
2014/01/02 职场文书
财务会计人员求职的自我评价
2014/01/13 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
大学生助学金感谢信
2015/01/21 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
html5表单的required属性使用
2021/07/07 HTML / CSS
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers