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查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
May 12 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
May 04 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
PHP7数组的底层实现示例
Aug 25 PHP
PHP生成随机字符串实例代码(字母+数字)
Sep 11 PHP
Thinkphp5.0框架视图view的模板布局用法分析
Oct 12 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 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
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
用正则获取指定路径文件的名称
2007/02/27 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
介绍Python的@property装饰器的用法
2015/04/28 Python
Python切片工具pillow用法示例
2018/03/30 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
大一自我鉴定范文
2013/10/04 职场文书
公益活动邀请函
2014/02/05 职场文书
旷课检讨书1000字
2014/02/14 职场文书
挂职自我鉴定
2014/02/26 职场文书
公司门卫工作职责
2014/06/28 职场文书
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
超市食品安全承诺书
2015/04/29 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
javascript函数式编程基础
2021/09/15 Javascript