需求, 请求第三方接口获取数据, 单个接口0.1秒, 如果有10万个接口, 那么岂不是得1万秒才能请求完, 所以使用PHP异步测试一下, 其他的方法还有:

1.使用队列, SupserVior 开多个进程

2.使用Guzzle(异步)

3.使用Swoole协程

4.直接使用多进程等

不过最好的方法应该还是使用异步, 不过可能存在两个缺点

1.异步不是很方便后续的逻辑处理, 应为它是一起请求的

2.并发请求会导致第三方接口可能处理不了, 导致503错误,或者是cpu满载(请求淘宝IP查询的接口出现过)

这里做个测试,使用淘宝的一个商品查询接口做请求

一.不使用异步

<?php/*** 1个请求      耗时 0.19000s,  平均每个耗时:0.19000s * 10个请求     耗时 1.60000s,  平均每个耗时:0.16000s * 100个请求    耗时 14.92400s, 平均每个耗时:0.14924s * 1000个请求   超时* */set_time_limit(0);$time = microtime(true);echo '<pre>开始时间' . date('Y-m-d H:i:s', time()) . '<br>';$data = $res =[];$count  = 1000;for ($i=0; $i <$count ; $i++) { $url = 'https://suggest.taobao.com/sug?code=utf-8&q=%E5%8D%AB%E8%A1%A3&callback=cb';$res[] = curl_request($url);}function curl_request($url, $post='', $cookie='', $returnCookie=0){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)');curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($curl, CURLOPT_AUTOREFERER, 1);curl_setopt($curl, CURLOPT_REFERER, "http://XXX");//关闭SSL验证curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);if($post) {curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));} else {//curl_setopt($curl, CURLOPT_POST, 1); //使用后大概快了20%, 但是这个是post请求的
        }if($cookie) {curl_setopt($curl, CURLOPT_COOKIE, $cookie);}curl_setopt($curl, CURLOPT_HEADER, $returnCookie);curl_setopt($curl, CURLOPT_TIMEOUT, 10);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$data = curl_exec($curl);if (curl_errno($curl)) {return curl_error($curl);}curl_close($curl);if($returnCookie){list($header, $body) = explode("\r\n\r\n", $data, 2);preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches);$info['cookie']  = substr($matches[1][0], 1);$info['content'] = $body;return $info;}else{return $data;}}$cost = microtime(true) - $time;echo "结束时间" .  date('Y-m-d H:i:s', time()) . ', 耗时 '. sprintf('%.5f', $cost) . 's, 平均每个耗时:' . sprintf('%.5f', $cost / $count) . 's <br>';var_dump($res);

二.使用异步请求

<?php/*** 1个请求      耗时 0.16300s   平均每个耗时:0.16300s * 10个请求     耗时 0.33500s   平均每个耗时:0.03350s * 100个请求    耗时 1.62600s,  平均每个耗时:0.01626s * 1000个请求   耗时 22.27700s, 平均每个耗时:0.02228s * */$time = microtime(true);
echo '<pre>开始时间' . date('Y-m-d H:i:s', time()) . '<br>';set_time_limit(0);$data = [];
$count = 1000;for ($i=0; $i <$count ; $i++) { $url = 'https://suggest.taobao.com/sug?code=utf-8&q=%E5%8D%AB%E8%A1%A3&callback=cb';$data[]['url'] = $url;
}function getMultiCurlResult($data = [], $timeout = 120)
{$request = [];$requestResource = curl_multi_init();foreach ($data as $k => $v) {$option = [CURLOPT_TIMEOUT => $timeout,//请求超时时间,防止死循环CURLOPT_RETURNTRANSFER => true,//获取的信息以文件流的形式返回,而不是直接输出。
        ];if (!isset($v['url']) || !$v['url']) return null;$option[CURLOPT_URL] = trim($v['url']);if (stripos($v['url'], 'https') === 0) $option[CURLOPT_SSL_VERIFYPEER] = false;if (isset($v['data'])) {//如果设置了请求参数,则是POST请求$option[CURLOPT_POST] = true;$option[CURLOPT_POSTFIELDS] = http_build_query($v['data']);}//启动一个curl会话$request[$k] = curl_init();//设置请求选项curl_setopt_array($request[$k], $option);//添加请求句柄curl_multi_add_handle($requestResource, $request[$k]);}$running = null;$result = [];do {//执行批处理句柄//CURLOPT_RETURNTRANSFER如果为0,这里会直接输出获取到的内容.如果为1,后面可以用curl_multi_getcontent获取内容.curl_multi_exec($requestResource, $running);//阻塞直到cURL批处理连接中有活动连接,不加这个会导致CPU负载超过90%.curl_multi_select($requestResource);} while ($running > 0);foreach ($request as $k => $v) {$result[$k] = curl_multi_getcontent($v);curl_multi_remove_handle($requestResource, $v);}curl_multi_close($requestResource);return $result;
}$res = getMultiCurlResult($data);$cost = microtime(true) - $time;
echo "结束时间" .  date('Y-m-d H:i:s', time()) . ', 耗时 '. sprintf('%.5f', $cost) . 's, 平均每个耗时:' . sprintf('%.5f', $cost / $count) . 's <br>';var_dump($res);

可以看出,异步的效果还是很明显的

转载于:https://www.cnblogs.com/Skrillex/p/11574619.html

PHP CURL 异步测试相关推荐

  1. 蛋疼的mocha库-promise异步测试

    mocha 测试库的使用 错误的处理异步测试 异步当出现断言错误的时候,他会抛出错误,但不会把这次测试当作失败,就是正确的顺利通过测试了,很无语. promise的reject会在then的第二个函数 ...

  2. 使用curl工具测试SAP Spartacus的SSR模式是否工作正常

    使用curl进行测试: if they are using PWA alognside SSR, besides first load, they will always see empty inde ...

  3. nodejs异步测试_异步过程的自动化测试

    nodejs异步测试 自从我开发了具有异步行为的服务器端应用程序以来已经有一段时间了,而该行为还不是事件驱动的系统. 异步行为始终是设计和测试中一个有趣的挑战. 通常,异步行为不应该很难进行单元测试– ...

  4. Kiwi 使用进阶 Mock, Stub, 参数捕获和异步测试

    Kiwi 是 iOS 的一个行为驱动开发 (Behavior Driven Development, BDD) 的测试框架,我们在上一篇入门介绍中简单了解了一些 iOS 中测试的概念以及 Kiwi 的 ...

  5. iOS开发--Kiwi使用进阶 Mock, Stub, 参数捕获和异步测试

    Kiwi 是 iOS 的一个行为驱动开发 (Behavior Driven Development, BDD) 的测试框架,我们在上一篇入门介绍中简单了解了一些 iOS 中测试的概念以及 Kiwi 的 ...

  6. iOS输入法—基于XCTest框架的异步测试

    苹果今年在Xcode 6中添加了XCTest框架此前漏掉的几项功能,这当中的异步测试功能大大方便了我们的测试工作. 如果我们的测试项目要执行一个异步任务,它可能会跑在其它的线程里,也可能会跑在主线程的 ...

  7. 自动化测试(二)01-前端测试分为单元测试、集成测试和E2E测试 测试工具对比-适合TDD或 BDD、断言、异步测试 测试工具的类型

    自动化测试(二)01-前端测试分为单元测试.集成测试和E2E测试 & 测试工具对比-适合TDD或 BDD.断言.异步测试 & 测试工具的类型 前端自动化测试 测试是一个庞大的主题,包括 ...

  8. body curl命令测试post_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!

    [导语]:Python实现的HTTP请求命令行客户端,我理解为curl的Python版本,但是提供了更友好,更易使用的命令及选项. 简介 HTTPie是使用Python实现的HTTP命令行工具,提供了 ...

  9. 玩转curl指令—测试简单的HTTP接口

    官网:https://curl.se/ GitHub:https://github.com/curl/curl Doc.:https://everything.curl.dev/ 昨天在测试一个HTT ...

最新文章

  1. Struts2 格式化输出时间
  2. Json返回结果为null属性不显示解决方法
  3. 小学生数学测试软件c语言流程图,小学生数学测试软件-C语言课程设计
  4. 算法题3 寻找丑数数值逼近
  5. oracle ogg双向通步,使用ogg的Oracle-Oracle的双向复制
  6. linux 查看服务器性能常用命令
  7. mysql驱动为什么自动加载_为什么JDBC中加载驱动要使用反射?
  8. 进程间通信IPC(二)(共享内存、信号、信号量)
  9. c++2010修复不了_汽车凹痕太小修复不了?汽车无痕修复是骗局还是技术不行?...
  10. java命令大全_Java命令行工具:javac、java、javap 的使用详解
  11. 深入详解Java线程池——ThreadPoolExecutor
  12. 重构手法之重新组织数据【1】
  13. 重磅丨银行机构数据治理指引来了,首席数据官、数据驱动、客户隐私、挂钩评级、问责机制通通提及 银保监会 成于微言
  14. maven实战之我见一(maven初识)
  15. 浪潮信息能制造超级计算机吗,浪潮信息为中国航天探索事业出力 高性能计算技术领衔...
  16. MySQL数据库学习路径 链接汇总
  17. 计算机名改为名字的拼音,批量转换中文文件名为拼音
  18. Opencv+opencv_contrib安装
  19. 设计FMEA步骤五:风险分析
  20. [原创]MASM32新手指南

热门文章

  1. 工业视觉中的目标检测——兼谈天池大赛优胜方案
  2. Python 超简单一键美化你的文章
  3. 自学成为动画师?你真的准备好了吗?
  4. 计算机组成原理二进制地址码,计算机组成原理第四章第三讲.ppt
  5. c语言程序设计电子图书 汉诺塔,用C写的汉诺塔(hanoi)程序
  6. 收藏 | 聊聊 GPU 的计算能力上限
  7. 收藏 | 使用合成数据集做目标检测
  8. PyTorch + NumPy这么做会降低模型准确率?
  9. 【绝对干货】TEASER前传之QUASAR:基于四元数的存在外点Wahba问题的可证明最优解
  10. 深度学习(六十六)生成模型、最大化似然、KL散度