在页面中调用的服务较多时,使用并行方式,即使用 curl_multi_* 系列函数耗时要小于 curl_* 系列函数。

  1. 测试环境
  2. 操作系统:Windows x64
  3. ServerApache 2.4.
  4. PHP5.6.
  5. MySQL5.7.
  6. cURL7.47.

测试数据库选择 MySQL 官方网站的样本数据库 sakila,下载地址:http://dev.mysql.com/doc/index-other.html

测试页面需要调用 3 个 api:

getActorInfo.php

  1. <?php
  2.  
  3. // 接口1
  4. $dsn = 'mysql:host=localhost;dbname=sakila';
  5. $user = 'root';
  6. $pwd = '';
  7. try {
  8. $pdo = new PDO($dsn, $user, $pwd);
  9. } catch(PDOException $e) {
  10. echo $e->getMessage();
  11. }
  12.  
  13. $sql = 'select * from actor limit 0, 100';
  14. $query = $pdo->query($sql);
  15. $query->setFetchMode(PDO::FETCH_ASSOC);
  16. $rs = $query->fetchAll();
  17. exit(json_encode($rs));

getAddressInfo.php

  1. <?php
  2.  
  3. // 接口2
  4. $dsn = 'mysql:host=localhost;dbname=sakila';
  5. $user = 'root';
  6. $pwd = '';
  7. try {
  8. $pdo = new PDO($dsn, $user, $pwd);
  9. } catch(PDOException $e) {
  10. echo $e->getMessage();
  11. }
  12.  
  13. $sql = 'select * from address limit 0, 100';
  14. $query = $pdo->query($sql);
  15. $query->setFetchMode(PDO::FETCH_ASSOC);
  16. $rs = $query->fetchAll();
  17. exit(json_encode($rs));

getCityInfo.php

  1. <?php
  2.  
  3. // 接口3
  4. $dsn = 'mysql:host=localhost;dbname=sakila';
  5. $user = 'root';
  6. $pwd = '';
  7. try {
  8. $pdo = new PDO($dsn, $user, $pwd);
  9. } catch(PDOException $e) {
  10. echo $e->getMessage();
  11. }
  12.  
  13. $sql = 'select * from city limit 0, 100';
  14. $query = $pdo->query($sql);
  15. $query->setFetchMode(PDO::FETCH_ASSOC);
  16. $rs = $query->fetchAll();
  17. exit(json_encode($rs));

首先使用 curl_* 系列函数调用这3个接口:

  1. <?php
  2.  
  3. list($usec, $sec) = explode(" ", microtime());
  4. $start = (float)$usec + (float)$sec;
  5.  
  6. $api = [];
  7. $api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getCityInfo.php';
  8. $api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getAddressInfo.php';
  9. $api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getActorInfo.php';
  10.  
  11. $ch = [];
  12. foreach($api as $key => $val) {
  13. $ch[$key] = curl_init($val);
  14. curl_setopt($ch[$key], CURLOPT_RETURNTRANSFER, TRUE);
  15. $result = curl_exec($ch[$key]);
  16. curl_close($ch[$key]);
  17. var_dump($result);
  18. }
  19.  
  20. list($usec, $sec) = explode(" ", microtime());
  21. $end = (float)$usec + (float)$sec;
  22.  
  23. $seconds = $end - $start;
  24. echo '耗时',$seconds,'秒';

分别取5次耗时的平均值:

第1次 第2次 第3次 第4次 第5次 平均
0.055s 0.046s 0.058s 0.049s 0.052s 0.052s

再使用 curl_multi_* 系列函数调用这3个接口

  1. <?php
  2.  
  3. list($usec, $sec) = explode(" ", microtime());
  4. $start = (float)$usec + (float)$sec;
  5.  
  6. $api = [];
  7. $api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getCityInfo.php';
  8. $api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getAddressInfo.php';
  9. $api[] = 'http://127.0.0.3/php/high-performance/5/curl/api/getActorInfo.php';
  10.  
  11. $ch = [];
  12. foreach($api as $key => $val) {
  13. $ch[$key] = curl_init($val);
  14. curl_setopt($ch[$key], CURLOPT_RETURNTRANSFER, TRUE);
  15. }
  16.  
  17. // 多个cURL资源加入到$mh句柄中
  18. $mh = curl_multi_init();
  19. foreach($ch as $key => $val) {
  20. curl_multi_add_handle($mh, $ch[$key]);
  21. }
  22.  
  23. // 执行批处理等待全部完成
  24. $running = null;
  25. do {
  26. curl_multi_exec($mh, $running);
  27. } while($running);
  28.  
  29. // 待完成后 获取返回的内容
  30. foreach($ch as $key => $val) {
  31. $result = curl_multi_getcontent($ch[$key]);
  32. var_dump($result);
  33. // 关闭各个句柄
  34. curl_multi_remove_handle($mh, $ch[$key]);
  35. }
  36.  
  37. list($usec, $sec) = explode(" ", microtime());
  38. $end = (float)$usec + (float)$sec;
  39.  
  40. $seconds = $end - $start;
  41. 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_* 系列函数进行多接口调用时的性能对比的更多相关文章

  1. Python的程序结构[4] -> 函数/Function[2] -> 匿名函数

    匿名函数 / Anonymous Function 匿名函数是一种不需要绑定函数名的函数 (i.e. functions that are not bound to a name).匿名函数通过 la ...

  2. 浅析php curl_multi_*系列函数进行批量http请求

    何起: 一系列 数量很大 数据不热 还希望被蜘蛛大量抓取的页面,在蜘蛛抓取高峰时,响应时间会被拉得很高. 前人做了这样一个事儿:页面分3块,用3个内部接口提供,入口文件用curl_multi_*系列函 ...

  3. 使用file_get_content系列函数和使用curl系列函数采集图片的性能对比

    由于公司的一个汽车网站的后台的汽车内容都是主要是来自与汽车之家的,编辑的同事们必须天天手动去对着汽车之家来添加汽车,实在是太蛋疼了.于是乎,为了改变这种状况,作为一个开发码农,我的任务就来了...那就 ...

  4. 深入理解this机制系列第三篇——箭头函数

    × 目录 [1]痛点 [2]解决 [3]基本用法[4]回调函数[5]注意事项 前面的话 this机制与函数调用有关,而作用域则与函数定义有关.有没有什么是可以将this机制和作用域联系起来的呢?本文将 ...

  5. 【函数】Oracle函数系列(2)--数学函数及日期函数

    [函数]Oracle函数系列(2)--数学函数及日期函数 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不 ...

  6. 开心菜鸟系列----函数作用域(javascript入门篇)

      1 <!DOCTYPE html>   2 <html>   3 <script src="./jquery-1.7.2.js"></ ...

  7. SSE 系列内置函数中的 shuffle 函数

    SSE 系列内置函数中的 shuffle 函数 邮箱: quarrying@qq.com 博客: http://www.cnblogs.com/quarryman/ 发布时间: 2017年04月18日 ...

  8. 深入理解javascript函数进阶系列第一篇——高阶函数

    前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...

  9. 大白话Vue源码系列(03):生成render函数

    阅读目录 优化 AST 生成 render 函数 小结 本来以为 Vue 的编译器模块比较好欺负,结果发现并没有那么简单.每一种语法指令都要考虑到,处理起来相当复杂.上篇已经生成了 AST,本篇依然对 ...

随机推荐

  1. JS正则表达式元字符

    https://segmentfault.com/a/1190000002471140

  2. .NET LINQ Set 运算

    Set 运算      LINQ 中的 Set 操作是指根据相同或不同集合(或集)中是否存在等效元素来生成结果集的查询操作. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表 ...

  3. node02-util

    目录:node01-创建服务器 node02-util node03-events node04-buffer node05-fs node06-path node07-http node08-exp ...

  4. Centos7 修改mysql指定用户的密码

    1.登陆mysql或者mariadb(两种任选其一) [root@localhost ~]# mysql -u root [root@localhost ~]# mysql -uroot -p 2.切 ...

  5. C++ 基础知识复习(一)

    数据类型,常量与变量部分:(发现有些点竟然这么多年第一次发现) C++基本数据类型有哪些: 答:整型,浮点型,void型. 注:其他各种数据类型均是这三种类型的扩充,另外void类型在实际程序中经常用 ...

  6. awk分隔符设置技巧

    Question:awk -F"[[]]"和awk -F"[][]"分割出的串为什么不一样呢? 按理说 -F"[]",[]表示匹配括号中的任 ...

  7. php 二维数组按某字段排序

    思路很重要,最好的方法是查询时按这个字段给你排好,把问题丢给数据库,比如  order by age ,如果遇到中文时需要这样写(mysql) 如:select * from category ord ...

  8. POJ1288 Sly Number(高斯消元 dfs枚举)

    由于解集只为{0, 1, 2}故消元后需dfs枚举求解 #include<cstdio> #include<iostream> #include<cstdlib> ...

  9. PLSQL Develop PlugIn 之脚本自动匹配补全工具CnPlugin

    插件位置:百度云 -- 开发工具空间 -- CnPlugin CnPlugin 支持PL/sql Developer 7.0以上版本,它可以根据 关键字+tab/space 来触发代码补全,而关键字. ...

  10. SimpleDateFomat里面的parse方法的使用

    parse方法用于将字符串类型的日期/时间解析为Date类型.语法 public Date parse(参数) 要加上这句 throws ParseException或者:try{}catch(){} ...