php使用curl并发减少后端访问时间的方法分析


Posted in PHP onMay 12, 2016

本文实例讲述了php使用curl并发减少后端访问时间的方法。分享给大家供大家参考,具体如下:

在我们平时的程序中难免出现同时访问几个接口的情况,平时我们用curl进行访问的时候,一般都是单个、顺序访问,假如有3个接口,每个接口耗时500毫 秒那么我们三个接口就要花费1500毫秒了,这个问题太头疼了严重影响了页面访问速度,有没有可能并发访问来提高速度呢?今天就简单的说一下,利用 curl并发来提高页面访问速度,

1、老的curl访问方式以及耗时统计

<?php
function curl_fetch($url, $timeout=3){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $data = curl_exec($ch);
  $errno = curl_errno($ch);
  if ($errno>0) {
    $data = false;
  }
  curl_close($ch);
  return $data;
}
function microtime_float()
{
  list($usec, $sec) = explode(" ", microtime());
  return ((float)$usec + (float)$sec);
}
$url_arr=array(
   "taobao"=>"http://www.taobao.com",
   "sohu"=>"http://www.sohu.com",
   "sina"=>"http://www.sina.com.cn",
   );
 $time_start = microtime_float();
 $data=array();
 foreach ($url_arr as $key=>$val)
 {
   $data[$key]=curl_fetch($val);
 }
 $time_end = microtime_float();
 $time = $time_end - $time_start;
 echo "耗时:{$time}";
?>

耗时:0.614秒

2、curl并发访问方式以及耗时统计

<?php
function curl_multi_fetch($urlarr=array()){
  $result=$res=$ch=array();
  $nch = 0;
  $mh = curl_multi_init();
  foreach ($urlarr as $nk => $url) {
    $timeout=2;
    $ch[$nch] = curl_init();
    curl_setopt_array($ch[$nch], array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => $timeout,
    ));
    curl_multi_add_handle($mh, $ch[$nch]);
    ++$nch;
  }
  /* wait for performing request */
  do {
    $mrc = curl_multi_exec($mh, $running);
  } while (CURLM_CALL_MULTI_PERFORM == $mrc);
  while ($running && $mrc == CURLM_OK) {
    // wait for network
    if (curl_multi_select($mh, 0.5) > -1) {
      // pull in new data;
      do {
        $mrc = curl_multi_exec($mh, $running);
      } while (CURLM_CALL_MULTI_PERFORM == $mrc);
    }
  }
  if ($mrc != CURLM_OK) {
    error_log("CURL Data Error");
  }
  /* get data */
  $nch = 0;
  foreach ($urlarr as $moudle=>$node) {
    if (($err = curl_error($ch[$nch])) == '') {
      $res[$nch]=curl_multi_getcontent($ch[$nch]);
      $result[$moudle]=$res[$nch];
    }
    else
    {
      error_log("curl error");
    }
    curl_multi_remove_handle($mh,$ch[$nch]);
    curl_close($ch[$nch]);
    ++$nch;
  }
  curl_multi_close($mh);
  return $result;
}
$url_arr=array(
   "taobao"=>"http://www.taobao.com",
   "sohu"=>"http://www.sohu.com",
   "sina"=>"http://www.sina.com.cn",
   );
function microtime_float()
{
  list($usec, $sec) = explode(" ", microtime());
  return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
$data=curl_multi_fetch($url_arr);
$time_end = microtime_float();
$time = $time_end - $time_start;
 echo "耗时:{$time}";
?>

耗时:0.316秒

帅气吧整个页面访问后端接口的时间节省了一半

3、curl相关参数

curl_close — Close a cURL session
curl_copy_handle — Copy a cURL handle along with all of its preferences
curl_errno — Return the last error number
curl_error — Return a string containing the last error for the current session
curl_exec — Perform a cURL session
curl_getinfo — Get information regarding a specific transfer
curl_init — Initialize a cURL session
curl_multi_add_handle — Add a normal cURL handle to a cURL multi handle
curl_multi_close — Close a set of cURL handles
curl_multi_exec — Run the sub-connections of the current cURL handle
curl_multi_getcontent — Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set
curl_multi_info_read — Get information about the current transfers
curl_multi_init — Returns a new cURL multi handle
curl_multi_remove_handle — Remove a multi handle from a set of cURL handles
curl_multi_select — Wait for activity on any curl_multi connection
curl_setopt_array — Set multiple options for a cURL transfer
curl_setopt — Set an option for a cURL transfer
curl_version — Gets cURL version information

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 高手之路(一)
Oct 09 PHP
PHP实现MVC开发得最简单的方法――模型
Apr 10 PHP
PHP面向对象概念
Nov 06 PHP
实现获取http内容的php函数分享
Feb 16 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
Jul 08 PHP
PHP Cookei记录用户历史浏览信息的代码
Feb 03 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP实现 APP端微信支付功能
Jun 22 PHP
Laravel框架实现的上传图片到七牛功能详解
Sep 06 PHP
关于PHP5.6+版本“No input file specified”问题的解决
Dec 11 PHP
PHP中isset、empty的用法与区别示例详解
Nov 05 PHP
PHP sdk实现在线打包代码示例
Dec 09 PHP
php反射类ReflectionClass用法分析
May 12 #PHP
PHP 的比较运算与逻辑运算详解
May 12 #PHP
php使用文本统计访问量的方法
May 12 #PHP
php格式化json函数示例代码
May 12 #PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 #PHP
yii2带搜索功能的下拉框实例详解
May 12 #PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
May 11 #PHP
You might like
php header函数的常用http头设置
2015/06/25 PHP
JS array 数组详解
2009/03/22 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
Python matplotlib绘图可视化知识点整理(小结)
2018/03/16 Python
解决python xx.py文件点击完之后一闪而过的问题
2019/06/24 Python
python numpy存取文件的方式
2020/04/01 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
灵泰克Java笔试题
2016/01/09 面试题
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
怎样写好自我鉴定
2013/12/04 职场文书
简历上的自我评价
2014/02/03 职场文书
大学生优秀自荐信范文
2014/02/25 职场文书
环境卫生标语
2014/06/09 职场文书
班级标语大全
2014/06/21 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
浅析JavaScript中的变量提升
2022/06/01 Javascript
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript