PHP 使用 curl_* 系列函数和 curl_multi_* 系列函数进行多接口调用时的性能对比
在页面中调用的服务较多时,使用并行方式,即使用 curl_multi_* 系列函数耗时要小于 curl_* 系列函数。
测试环境
操作系统:Windows x64
Server:Apache 2.4.
PHP:5.6.
MySQL:5.7.
cURL:7.47.
测试数据库选择 MySQL 官方网站的样本数据库 sakila,下载地址:http://dev.mysql.com/doc/index-other.html
测试页面需要调用 3 个 api:
getActorInfo.php
<?php // 接口1
$dsn = 'mysql:host=localhost;dbname=sakila';
$user = 'root';
$pwd = '';
try {
$pdo = new PDO($dsn, $user, $pwd);
} catch(PDOException $e) {
echo $e->getMessage();
} $sql = 'select * from actor limit 0, 100';
$query = $pdo->query($sql);
$query->setFetchMode(PDO::FETCH_ASSOC);
$rs = $query->fetchAll();
exit(json_encode($rs));
getAddressInfo.php
<?php // 接口2
$dsn = 'mysql:host=localhost;dbname=sakila';
$user = 'root';
$pwd = '';
try {
$pdo = new PDO($dsn, $user, $pwd);
} catch(PDOException $e) {
echo $e->getMessage();
} $sql = 'select * from address limit 0, 100';
$query = $pdo->query($sql);
$query->setFetchMode(PDO::FETCH_ASSOC);
$rs = $query->fetchAll();
exit(json_encode($rs));
getCityInfo.php
<?php // 接口3
$dsn = 'mysql:host=localhost;dbname=sakila';
$user = 'root';
$pwd = '';
try {
$pdo = new PDO($dsn, $user, $pwd);
} catch(PDOException $e) {
echo $e->getMessage();
} $sql = 'select * from city limit 0, 100';
$query = $pdo->query($sql);
$query->setFetchMode(PDO::FETCH_ASSOC);
$rs = $query->fetchAll();
exit(json_encode($rs));
首先使用 curl_* 系列函数调用这3个接口:
<?php list($usec, $sec) = explode(" ", microtime());
$start = (float)$usec + (float)$sec; $api = [];
$api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getCityInfo.php';
$api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getAddressInfo.php';
$api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getActorInfo.php'; $ch = [];
foreach($api as $key => $val) {
$ch[$key] = curl_init($val);
curl_setopt($ch[$key], CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch[$key]);
curl_close($ch[$key]);
var_dump($result);
} list($usec, $sec) = explode(" ", microtime());
$end = (float)$usec + (float)$sec; $seconds = $end - $start;
echo '耗时',$seconds,'秒';
分别取5次耗时的平均值:
第1次 | 第2次 | 第3次 | 第4次 | 第5次 | 平均 |
0.055s | 0.046s | 0.058s | 0.049s | 0.052s | 0.052s |
再使用 curl_multi_* 系列函数调用这3个接口
<?php list($usec, $sec) = explode(" ", microtime());
$start = (float)$usec + (float)$sec; $api = [];
$api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getCityInfo.php';
$api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getAddressInfo.php';
$api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getActorInfo.php'; $ch = [];
foreach($api as $key => $val) {
$ch[$key] = curl_init($val);
curl_setopt($ch[$key], CURLOPT_RETURNTRANSFER, TRUE);
} // 多个cURL资源加入到$mh句柄中
$mh = curl_multi_init();
foreach($ch as $key => $val) {
curl_multi_add_handle($mh, $ch[$key]);
} // 执行批处理等待全部完成
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running); // 待完成后 获取返回的内容
foreach($ch as $key => $val) {
$result = curl_multi_getcontent($ch[$key]);
var_dump($result);
// 关闭各个句柄
curl_multi_remove_handle($mh, $ch[$key]);
} list($usec, $sec) = explode(" ", microtime());
$end = (float)$usec + (float)$sec; $seconds = $end - $start;
echo '耗时',$seconds,'秒';
第1次 | 第2次 | 第3次 | 第4次 | 第5次 | 平均 |
0.038s | 0.049s | 0.038s | 0.026s | 0.027s | 0.0356s |
使用 curl_* 系列函数多接口调用5次的平均耗时是0.052秒,使用curl_multi_*系列函数多接口调用5次的平均耗时是0.0356秒。
PHP 使用 curl_* 系列函数和 curl_multi_* 系列函数进行多接口调用时的性能对比的更多相关文章
- Python的程序结构[4] -> 函数/Function[2] -> 匿名函数
匿名函数 / Anonymous Function 匿名函数是一种不需要绑定函数名的函数 (i.e. functions that are not bound to a name).匿名函数通过 la ...
- 浅析php curl_multi_*系列函数进行批量http请求
何起: 一系列 数量很大 数据不热 还希望被蜘蛛大量抓取的页面,在蜘蛛抓取高峰时,响应时间会被拉得很高. 前人做了这样一个事儿:页面分3块,用3个内部接口提供,入口文件用curl_multi_*系列函 ...
- 使用file_get_content系列函数和使用curl系列函数采集图片的性能对比
由于公司的一个汽车网站的后台的汽车内容都是主要是来自与汽车之家的,编辑的同事们必须天天手动去对着汽车之家来添加汽车,实在是太蛋疼了.于是乎,为了改变这种状况,作为一个开发码农,我的任务就来了...那就 ...
- 深入理解this机制系列第三篇——箭头函数
× 目录 [1]痛点 [2]解决 [3]基本用法[4]回调函数[5]注意事项 前面的话 this机制与函数调用有关,而作用域则与函数定义有关.有没有什么是可以将this机制和作用域联系起来的呢?本文将 ...
- 【函数】Oracle函数系列(2)--数学函数及日期函数
[函数]Oracle函数系列(2)--数学函数及日期函数 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不 ...
- 开心菜鸟系列----函数作用域(javascript入门篇)
1 <!DOCTYPE html> 2 <html> 3 <script src="./jquery-1.7.2.js"></ ...
- SSE 系列内置函数中的 shuffle 函数
SSE 系列内置函数中的 shuffle 函数 邮箱: quarrying@qq.com 博客: http://www.cnblogs.com/quarryman/ 发布时间: 2017年04月18日 ...
- 深入理解javascript函数进阶系列第一篇——高阶函数
前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...
- 大白话Vue源码系列(03):生成render函数
阅读目录 优化 AST 生成 render 函数 小结 本来以为 Vue 的编译器模块比较好欺负,结果发现并没有那么简单.每一种语法指令都要考虑到,处理起来相当复杂.上篇已经生成了 AST,本篇依然对 ...
随机推荐
- BZOJ2435——[Noi2011]道路修建
1.题意:给个树,边的权值=两边的点数差*此边的长度,求所有边的权值和 2.分析:真不想说啥了...dfs即可 #include <cmath> #include <cstdio&g ...
- 【SCOI2005】 最大子矩阵 BZOJ 1084
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- .NET LINQ Set 运算
Set 运算 LINQ 中的 Set 操作是指根据相同或不同集合(或集)中是否存在等效元素来生成结果集的查询操作. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表 ...
- mysql 外键 级联
主表 -- 创建用户信息表 create table userinfo ( userid int primary key not null auto_increment COMMENT '主键', u ...
- hdu 1358 Period
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 思路:Next数组的用法,在第i个位置上如果有i%(i-Next[i])==0的话最小循环节就是 ...
- 收藏的几个经典Flash
本人收藏了几个有意思的Flash,在此与大家分享下 1.黄金矿工中文版.swf 2.中国象棋.swf 3.运动的老鼠.swf 4.时钟.swf 5. 2048.swf 6.小猫逃跑.swf
- iis 7.0 asp.net发布问题
问题1: 配置错误:不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的………… 解决方案: 因为 IIS 7 采用了更安全的 web.config 管理机制,默认 ...
- SSM框架整合首只拦路虎——Eclipse新建Maven Project界面select an archetype 空白
首先给大家说,本篇博客没有技术价值,纯属个人学习总结,权当给大家添加一乐.事件如有雷同,纯属巧合,莫怪! 前一段时间一直在看<淘淘商城>这个教程,里面讲的是SSM框架的一个电商项目.这不是 ...
- nfs的挂载方法
对于很多嵌入式驱动开发者,要进行很多次调试,如果nfs搭建不起来,那么对开发是很不方便的.经过三天,我终于把自己编的内核下载到开发板,并实现了nfs文件系统的挂载.今天把过程写下来. 思路 一 编译a ...
- 转载:Tomcat的JVM设置和连接数设置
Windows环境下修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:set JAVA_OPTS=-Xms256m -Xmx512m Linux环境下修 ...