composer require guzzlehttp/guzzle 6.5.5
  1. 使用中间件

    // 堆栈
    $stack = HandlerStack::create();
    $stack->push(Middleware::mapRequest(function (RequestInterface $request) {
        // 加密请求参数
        // 在此处您可以实现加密逻辑
        // 这里的示例是将请求参数转换为JSON格式
        $encryptedBody = json_decode($request->getBody()->getContents(), true);
        // 创建一个新的请求,将加密后的参数设置为请求主体
        $request = $request->withBody(\GuzzleHttp\Psr7\stream_for($request->getBody()));
        return $request;
    }));
    $stack->push(Middleware::mapResponse(function (ResponseInterface $response) {
        // 在此处对响应内容进行解密
        // 这里的示例是将响应内容解密后返回
        $decryptedBody = json_decode($response->getBody(), true);
        // 创建一个新的响应,将解密后的内容设置为响应主体
        return $response->withBody(\GuzzleHttp\Psr7\stream_for(json_encode($decryptedBody)));
    }));

    $client = new Client([
        'handler'  => $stack,
        'base_uri' => '', // 请求的域名
        'headers'  => ['Content-Type' => 'application/json'],
        'timeout'  => 5,
    ]);

    $response = $client->post('/aa/bb', [
        'json' => ['a' => 'b'],
    ]);

    // 获取解密后的响应内容 body是个字符串,需要再json_decode
    $body = $response->getBody()->getContents();
  1. 并发请求 发起固定数量请求

     $t1       = microtime(true);
     $client   = new Client(['base_uri' => '']);
     $promises = [];
     $total    = 10;
     for ($i = 0; $i < $total; $i++) {
         $promises[] = $client->postAsync('/aa/bb', [
             'headers' => ['Content-Type' => 'application/json'],
             'json'    => $params,
             'timeout' => 1,
         ]);
     }
    
     try {
         $responses = Promise\Utils::unwrap($promises);
         $t2        = microtime(true);
         echo '请求次数 ' . $total . ' 耗时:' . ($t2 - $t1) . PHP_EOL;
         foreach ($responses as $res) {
             $body = $res->getBody()->getContents();
             dump($body);
         }
     } catch (\Exception $e) {
         // 如果有请求异常会抛出异常 : RequestException
         if ($e instanceof \GuzzleHttp\Exception\GuzzleException) {
             echo 'http error:' . $e->getMessage();
         } else {
             echo 'other error:' . $e->getMessage();
         }
     }
     // 等待请求完成,即使其中一些请求已经失败
     $responses = Promise\Utils::settle($promises)->wait();
     foreach ($responses as $key => $value) {
         if ($value['state'] === 'fulfilled') {
             $contents = $value['value']->getBody()->getContents();
         } elseif ($value['state'] === 'rejected') {
             
         }
     }
    
  2. 并发,多线程 发送不确定数量的请求

     $client   = new Client(['base_uri' => '']);    
     $requests = function ($total, $client, $params) {
         $uri = '/aa/bb';
         for ($i = 0; $i < $total; $i++) {
             yield function () use ($uri, $client, $params, $i) {
                 $params['i'] = $i;
                 return $client->requestAsync('POST', $uri, ['json' => $params]);
             };
         }
     };
    
     $return = [];
     $pool = new Pool($client, $requests($total, $client, $params), [
         'concurrency' => 5,
         'fulfilled'   => function ($response, $index) use (&$return) {
             $body           = $response->getBody()->getContents();
             $return[$index] = $body;
         },
         'rejected'    => function ($reason, $index) {
             echo 'rejected ' . $index . $reason . PHP_EOL;
         },
     ]);
    
     $promises = $pool->promise();
     $promises->wait();
     dump($return);
    

对外部变量进行写操作的时候,需要加上&引用,类似指针,不然外部变量不会实质更改。
新建promise、配置promise->then、返回promise三步走

一个封装的实现多个接口调用并发调用

标签: none

已有 37 条评论

  1. 博主真是太厉害了!!!

  2. 叼茂SEO.bfbikes.com

  3. 想想你的文章写的特别好

  4. 不错不错,我喜欢看 https://www.jiwenlaw.com/

  5. 怎么收藏这篇文章?

  6. 想想你的文章写的特别好https://www.237fa.com/

  7. 看的我热血沸腾啊https://www.237fa.com/

  8. 看的我热血沸腾啊https://www.ea55.com/

  9. 不错不错,我喜欢看 https://www.ea55.com/

  10. 不错不错,我喜欢看 www.jiwenlaw.com

  11. 不错不错,我喜欢看 www.jiwenlaw.com

  12. 兄弟写的非常好 https://www.cscnn.com/

  13. 《他们的边境梦》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/19883.html

  14. 《他们的边境梦》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/19883.html

  15. 复古传奇高爆版:攻略与评测?:https://501h.com/fugu/5535.html

  16. 《医神下凡》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/13926.html

  17. 《医神下凡》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/13926.html

  18. 《绿苹果蓝天空》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/113007.html

  19. 《医神下凡》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/13926.html

  20. 《绿苹果蓝天空》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/113007.html

  21. 《吸血鬼的颤抖》科幻片高清在线免费观看:https://www.jgz518.com/xingkong/40661.html

  22. 《医神下凡》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/13926.html

  23. 《绿苹果蓝天空》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/113007.html

  24. 《吸血鬼的颤抖》科幻片高清在线免费观看:https://www.jgz518.com/xingkong/40661.html

  25. 《吸血鬼的颤抖》科幻片高清在线免费观看:https://www.jgz518.com/xingkong/40661.html

  26. 《邻居》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/141119.html

  27. 《世界之战第三季》欧美剧高清在线免费观看:https://www.jgz518.com/xingkong/164713.html

  28. 哈哈哈,写的太好了https://www.lawjida.com/

  29. 案例丰富且贴合主题,论证逻辑环环相扣。

  30. 这篇文章如同一幅色彩斑斓的画卷,每一笔都充满了独特的创意。

  31. 学术术语使用精准,专业性突出。

  32. 作者以简洁明了的语言,传达了深刻的思想和情感。

  33. 作者的布局谋篇匠心独运,让读者在阅读中享受到了思维的乐趣。

  34. 这篇文章不错!

  35. 2025年10月新盘 做第一批吃螃蟹的人coinsrore.com

  36. 2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

  37. 2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

添加新评论

  • 上一篇: 没有了
  • 下一篇: 没有了