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来处理多个提交任务
May 08 PHP
PHP 遍历XP文件夹下所有文件
Nov 27 PHP
php auth_http类库进行身份效验
Mar 19 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
thinkphp使用literal防止模板标签被解析的方法
Nov 22 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
Feb 20 PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
实例介绍PHP中zip_open()函数用法
Feb 15 PHP
通过PHP设置BugFree获取邮箱通知
Apr 25 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面向对象编程快速入门
2006/10/09 PHP
桌面中心(二)数据库写入
2006/10/09 PHP
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
python代码过长的换行方法
2018/07/19 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
庆七一活动方案
2014/01/25 职场文书
工程建设实施方案
2014/03/14 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
企业安全生产规章制度
2015/08/06 职场文书