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 存取 MySQL 数据库的一个例子
Oct 09 PHP
在线增减.htpasswd内的用户
Oct 09 PHP
PHP语法速查表
Jan 02 PHP
zend framework多模块多布局配置
Feb 26 PHP
供参考的 php 学习提高路线分享
Oct 23 PHP
PHP中使用addslashes函数转义的安全性原理分析
Nov 03 PHP
PHP实现自动识别Restful API的返回内容类型
Feb 07 PHP
php使用curl简单抓取远程url的方法
Mar 13 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
php实现在站点里面添加邮件发送的功能
Apr 28 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP实现数组和对象的相互转换操作示例
Mar 20 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
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
深入理解Node.js的HTTP模块
2016/10/12 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
Vue实现计算器计算效果
2020/08/17 Javascript
Python正则表达式分组概念与用法详解
2017/06/24 Python
Python对象属性自动更新操作示例
2018/06/15 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
虚拟机下载python是否需要联网
2020/07/27 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
python爬取股票最新数据并用excel绘制树状图的示例
2021/03/01 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
Diptyque英国官方网站:源自法国的知名香氛品牌
2019/08/28 全球购物
九月份红领巾广播稿
2014/01/22 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
python代码实现备忘录案例讲解
2021/07/26 Python
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS