问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php中怎么使用guzzlehttp

发布网友 发布时间:2022-04-29 06:25

我来回答

2个回答

懂视网 时间:2022-04-29 10:47

发送异步的 POST 请求

在 PHP 开发中主要是「面向过程」式的开发方式,但请求第三方接口时,有时候并不需要等待第三方接口返回结果才继续执行。如用户购买成功时,我们需要向短信接口,发送一个 post 请求,由短信平台发送一条短信给用户,告知用户支付成功了,因为这类「提醒消息」属于「额外的附加功能」,并不需要在用户支付时「知道」有没有发送提醒成功。

这时候可以使用 Guzzle 的异步请求功能,直接看代码:

public function sms(Request $request) {
 $code = $request->input('code');
 $client = new Client();
 $sid = '9815b4a2bb6d5******8bdb1828644f2';
 $time = '20171029173312';
 $token = 'af8728c8bc*******12019c680df4b11c';

 $sig = strtoupper(md5($sid.$token.$time));

 $auth = trim(base64_encode($sid . ":" . $time));

 $params = ['templateSMS' => [
  'appId' => '12b43**********0091c73c0ab',
  'param' => "coding01,$code,30",
  'templateId' => '3***3',
  'to' => '17689974321'
 ]
 ];
 $options = json_encode($params, JSON_UNESCAPED_UNICODE);
 $data = [
 'query' => [
  'sig' => $sig
 ],
 'body' => $options,
 'headers' => [
  'content-type' => 'application/json',
  'Authorization' => $auth
 ]
 ];

 // 发送 post 请求
 $promise = $client->requestAsync('POST', 'https://api.ucpaas.com/2014-06-30/Accounts/9815b4a2bb6d5******8bdb1828644f2/Messages/templateSMS', $data);

 $promise->then(
 function (ResponseInterface $res) {
  Log::info('---');
  Log::info($res->getStatusCode() . "
");
  Log::info($res->getBody()->getContents() . "
");
 },
 function (RequestException $e) {
  Log::info('-__-');
  Log::info($e->getMessage() . "
");
 }
 );
 $promise->wait();

 return $this->output_json('200', '测试短信 api', []);
}

先返回接口数据:

6302-95ec6d7a688f1072.jpg

然后再输出 Log:

[2017-10-29 09:53:14] local.INFO: --- 
[2017-10-29 09:53:14] local.INFO: 200
 
[2017-10-29 09:53:14] local.INFO: {"resp":{"respCode":"000000","templateSMS":{"createDate":"20171029175314","smsId":"24a93f323c9*****8608568"}}}

最后收到短信信息:

微信截图_20200501093336.png

发送多线程异步 POST 请求

「发送多线程异步 POST 请求」在很多场合中使用到的,如:双十一快到了,可以做一些回馈老用户的活动,这是就需要批量的向老用户推送一条模板消息,告诉用户参与哪些活动的。这时候就需要用到多线程异步请求微信公众号接口。

直接上代码:

public function send($templateid, $openid, $url, $data) {
 $client = $this->bnotice->getHttp()->getClient();

 $requests = function ($open_ids) use ($templateid, $url, $data) {
  foreach($open_ids as $v){
  try {
   yield $this->bnotice
   ->template($templateid)
   ->to($v)
   ->url($url)
   ->data($data)
   ->request();
  } catch(Exception $e) {
   Log::error('sendtemplate:'.$e->getMessage());
  }
  }
 };

 $pool = new Pool($client, $requests($openid), [
  'concurrency' => 16,
  'fulfilled' => function ($response, $index) {
  },
  'rejected' => function ($reason, $index) {
  },
 ]);

 $promise = $pool->promise();

 $promise->wait();
 }

其中 request 方法:

public function request($data = [])
 {
 $params = array_merge([
  'touser' => '',
  'template_id' => '',
  'url' => '',
  'topcolor' => '',
  'miniprogram' => [],
  'data' => [],
 ], $data);
 
 $required = ['touser', 'template_id'];

 foreach ($params as $key => $value) {
  if (in_array($key, $required, true) && empty($value) && empty($this->message[$key])) {
  throw new InvalidArgumentException("Attribute '$key' can not be empty!");
  }

  $params[$key] = empty($value) ? $this->message[$key] : $value;
 }

 $params['data'] = $this->formatData($params['data']);

 $this->message = $this->messageBackup;

 $options = json_encode ( $params, JSON_UNESCAPED_UNICODE);
 $data = [
  'query' => [
  'access_token' => $this->getAccessToken()->getToken()
  ],
  'body' => $options,
  'headers' => ['content-type' => 'application/json']
 ];
 return function() use ($data) {
  return $this->getHttp()->getClient()->requestAsync('POST', $this::API_SEND_NOTICE, $data);
 };
 }

Guzzle 多线程异步请求原型函数,使用 GuzzleHttpPool 对象

use GuzzleHttpPool;use GuzzleHttpClient;use GuzzleHttpPsr7Request;$client = new Client();$requests = function ($total) {
 $uri = 'http://127.0.0.1:8126/guzzle-server/perf';
 for ($i = 0; $i < $total; $i++) {
 yield new Request('GET', $uri);
 }};$pool = new Pool($client, $requests(100), [
 'concurrency' => 5,
 'fulfilled' => function ($response, $index) {
 // this is delivered each successful response
 },
 'rejected' => function ($reason, $index) {
 // this is delivered each failed request
 },]);// Initiate the transfers and create a promise$promise = $pool->promise();// Force the pool of requests to complete.$promise->wait();

总结

有了 Guzzle,极大方便了我们并发异步请求第三方接口。如果时间允许,我们可以看看 Guzzle 源代码,看看是如何实现的。

推荐教程:《PHP教程》

热心网友 时间:2022-04-29 07:55

直接在 composer.json 的 require 一项中加入,
"guzzlehttp/guzzle": "6.*"

然后运行:composer update

就这样使用的,我也是在后盾人实训班学会的的现在包住宿的哦
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
诺基亚5233直签工具 我的5233下了证书、也在塞班官网上在线签名了、怎么还是提示证实书错误... 你好 就是我用的诺基亚5233直签工具就是用不了什么受证书限制内部错误... 请问哪里有做餐用包装纸巾的.厂 怎么在餐巾纸上或者纸巾包装上打广告? 广告餐巾纸广告餐巾纸的分类 广告餐巾纸广告餐巾纸的制作形式 ...支付密码一样呢?支付密码和银行卡的关系是什么?求解答, ...今天是怎么了,换了数据线也不行,同事的M1也一样不能充电... 小米M1和小米青春版就是CPU和内存不一样,我是学生,买哪一个比较好? 帕金森病对患者有哪些影响? 作文 在风雨中前行 北京元旦一日游哪里比较好? 帕金森病会给患者带来哪些危害 北京元旦去哪里比较好 帕金森病的危害有多大? 风雨同路作文600字左右 素炒杏鲍菇怎么做好吃 帕金森病的危害 怎样去除竹席上面的霉? 帕金森都会对人体产生哪些影响与危害? 海外地区怎么使用酷狗音乐播放器 帕金森病的危害有哪些呢? 元旦假期北京周边有什么值得去的地方? 怎样去除竹席上的霉? 帕金森病对生活会产生哪些影响? 生命中,有你风雨兼程作文 酷狗国外听歌地域限制怎么解除? 洋葱炒豌豆的做法有哪些? 请问在北京的游子元旦去哪玩好? 元旦期间北京哪些地方好玩?小长假想出去看看~ 帕金森病的危害是什么? 马上元旦了大家推荐一下北京有什么好玩的地方没 以“既然选择了远方,便只顾风雨兼程。不管前方的路途多么坎坷,我都会奋 ... 帕金森到中晚期会影响什么? 北京元旦适合去哪玩 帕金森病会对人体神经造成哪些损伤? 在北京,元旦去哪好玩?长城可以吗? 梦见和俩女人在泥水里走着玩 梦见走在泥水中是怎么回事? 梦见很多人在泥田里玩得全身是泥水 梦见在泥水里翻跟斗 梦见河流干枯,我在里面玩淤泥? 贷款买房办房产证能加配偶名字吗 房产证上加妻子的名字要多少钱吗 带有作文题目要求的中考满分作文 中考 语文作文好的示例于范文 阴道炎怎么处理? 使用guzzle要开启php的什么扩展 平时应该怎么冲洗阴道