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 相关文章推荐
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
sql注入与转义的php函数代码
Jun 17 PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 PHP
php判断手机访问还是电脑访问示例分享
Jan 20 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
May 18 PHP
php使用变量动态创建类的对象用法示例
Feb 06 PHP
php生成0~1随机小数的方法(必看)
Apr 05 PHP
自制PHP框架之模型与数据库
May 07 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
Apr 01 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
smarty实例教程
2006/11/19 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
学习Bootstrap组件之下拉菜单
2015/07/28 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
jQuery基于正则表达式的表单验证功能示例
2017/01/21 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
Python爬虫实现百度图片自动下载
2018/02/04 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
python判断元素是否存在的实例方法
2020/09/24 Python
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
C#基础面试题
2016/10/17 面试题
中药专业大学生医药工作求职信
2013/10/25 职场文书
运动会入场解说词300字
2014/01/25 职场文书
见习期自我鉴定
2014/01/31 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
安全宣传标语口号
2014/06/06 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
服务员岗位职责范本
2015/04/09 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
python实现自动化群控的步骤
2021/04/11 Python
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
Vue操作Storage本地化存储
2022/04/29 Vue.js