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+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
smarty 缓存控制前的页面静态化原理
Mar 15 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
Sep 06 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
Mar 02 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
注意!PHP 7中不要做的10件事
Sep 18 PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 PHP
PHP中常用的魔术方法
Apr 28 PHP
php生成条形码的图片的实例详解
Sep 13 PHP
PHP7新增函数
Mar 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 Mysql编程之高级技巧
2008/08/27 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
JavaScript 特殊字符
2007/04/05 Javascript
javascript之更有效率的字符串替换
2008/08/02 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
Web开发之JavaScript
2012/03/29 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
在Python中执行系统命令的方法示例详解
2017/09/14 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
Python用字典构建多级菜单功能
2019/07/11 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
Python的in,is和id函数代码实例
2020/04/18 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
线程同步的方法
2016/11/23 面试题
应届本科生推荐信范文
2013/12/25 职场文书
个人廉洁自律承诺书
2014/03/27 职场文书
工商管理本科生求职信
2014/07/13 职场文书
2014年民警工作总结
2014/11/25 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书