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 相关文章推荐
apache+mysql+php+ssl服务器之完全安装攻略
Sep 05 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
Oct 12 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
解析php中eclipse 用空格替换 tab键
Jun 24 PHP
PHP的基本常识小结
Jul 05 PHP
怎么在Windows系统中搭建php环境
Aug 31 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
隐性调用php程序的方法
Jun 13 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 PHP
PHP实现的大文件切割与合并功能示例
Apr 10 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获取随机数字和字母的方法详解
2013/06/06 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
python根据路径导入模块的方法
2014/09/30 Python
python脚本替换指定行实现步骤
2017/07/11 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python 多线程串行和并行的实例
2019/02/22 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
pytorch 求网络模型参数实例
2019/12/30 Python
学python需要去培训机构吗
2020/07/01 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
英文自我鉴定
2013/12/10 职场文书
社团文化节邀请函
2014/01/10 职场文书
酒店管理求职信
2014/06/09 职场文书
个人党性分析总结
2015/03/05 职场文书
信用卡催款律师函
2015/05/27 职场文书
Python自然语言处理之切分算法详解
2021/04/25 Python
MySQL窗口函数的具体使用
2021/11/17 MySQL
python开发人人对战的五子棋小游戏
2022/05/02 Python