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 相关文章推荐
2.PHP入门
Oct 09 PHP
实现分十页分向前十页向后十页的处理
Oct 09 PHP
CodeIgniter php mvc框架 中国网站
May 26 PHP
Zend的MVC机制使用分析(二)
May 02 PHP
php分割合并两个字符串的函数实例
Jun 19 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
php unicode编码和字符串互转的方法
Aug 12 PHP
PHP简单实现遍历目录下特定文件的方法小结
May 22 PHP
PHP实现唤起微信支付功能
Feb 18 PHP
PHP下载大文件失败并限制下载速度的实例代码
May 10 PHP
PHP查找一列有序数组是否包含某值的方法
Feb 07 PHP
如何判断微信付款码和支付宝付款码
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
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
浅析php学习的路线图
2013/07/10 PHP
php获取随机数组列表的方法
2014/11/13 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
javascript正则表达式中的replace方法详解
2015/04/20 Javascript
javascript实现禁止鼠标滚轮事件
2015/07/24 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
vue $set 给数据赋值的实例
2019/11/09 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
Django中使用locals()函数的技巧
2015/07/16 Python
Python对数据库操作
2016/03/28 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
2018/06/05 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
python实现求两个字符串的最长公共子串方法
2018/07/20 Python
Python 字符串换行的多种方式
2018/09/06 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
C/C++程序员常见面试题二
2015/11/19 面试题
世界经理人咨询有限公司面试
2014/09/23 面试题
高中军训的心得体会
2014/09/01 职场文书
单位单身证明样本
2014/10/11 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
解决 redis 无法远程连接
2022/05/15 Redis