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 相关文章推荐
5.PHP的其他功能
Oct 09 PHP
简单的php 验证图片生成函数
May 21 PHP
PHP clearstatcache()函数详解
Mar 02 PHP
php绝对路径与相对路径之间关系的的分析
Mar 03 PHP
Linux下php5.4启动脚本
Aug 03 PHP
php简单日历函数
Oct 28 PHP
静态html文件执行php语句的方法(推荐)
Nov 21 PHP
php基于PDO实现功能强大的MYSQL封装类实例
Feb 27 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
PHP多进程通信-消息队列使用
Mar 08 PHP
PHP实现的杨辉三角求解算法分析
Mar 11 PHP
thinkphp整合系列之极验滑动验证码geetest功能
Jun 18 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 MsSql server时遇到的中文编码问题
2009/06/11 PHP
Windows下安装Memcached的步骤说明
2010/04/25 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
基于postman获取动态数据过程详解
2020/09/08 Javascript
python中list循环语句用法实例
2014/11/10 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
python pillow模块使用方法详解
2019/08/30 Python
selenium如何定位span元素的实现
2021/01/13 Python
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
全球工业:Global Industrial
2020/02/01 全球购物
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
公司市场部岗位职责
2013/12/02 职场文书
房地产还款计划书
2014/01/10 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
银行进社区活动总结
2014/07/07 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
主持人大赛开场白
2015/05/29 职场文书
消防宣传语大全
2015/07/13 职场文书