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 相关文章推荐
mysql 全文搜索 技巧
Apr 27 PHP
PHP 输出缓存详解
Jun 20 PHP
10个超级有用的PHP代码片段果断收藏
Sep 23 PHP
php获取远程文件大小
Oct 20 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 PHP
非常重要的php正则表达式详解
Jan 04 PHP
详解PHP匿名函数与注意事项
Mar 29 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
Nov 28 PHP
基于laravel Request的所有方法详解
Sep 29 PHP
PHP 99乘法表的几种实现代码
Oct 13 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
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
php切割页面div内容的实现代码分享
2012/07/31 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
2013/05/06 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
javascript 函数使用说明
2010/04/07 Javascript
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
python中子类调用父类函数的方法示例
2017/08/18 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
使用AJAX和Django获取数据的方法实例
2020/10/25 Python
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
C语言如何决定使用那种整数类型
2016/11/26 面试题
网络工程专业毕业生推荐信
2013/10/28 职场文书
家长会主持词开场白
2015/05/29 职场文书