php guzzle批量请求

有个需求需要批量请求接口,于是想到了guzzle有这个功能,这里就写个文章记录一下
直接上代码
首先use

use GuzzleHttp\Pool;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;

get请求

    $client = new Client();
    foreach ($links as $link) {
        $requests[] = new Request('GET', $link);
    }

    $responses = Pool::batch($client, $requests, array(
        'concurrency' => 15,
    ));

    foreach ($responses as $response) {
         //do something
    }

post请求

    $client = new Client();
    foreach ($links as $link) {
        $requests[] = new Request('POST', $link,$headers,$body);
    }

    $responses = Pool::batch($client, $requests, array(
        'concurrency' => 15,
    ));

    foreach ($responses as $response) {
         //do something
    }

异步请求

   $client = new Client();

	$requests = function ($datas) {
	    $uri = 'http://127.0.0.1:8126/guzzle-server/perf';
	    foreach($datas as $v){
	    	yield new Request('POST', $link,$headers,$v);
	    }
	};
	$pool = new Pool($client, $requests($datas), [
	    'concurrency' => 5,
	    'fulfilled' => function ($response, $index) {
	        // 请求成功时的处理
	    },
	    'rejected' => function ($reason, $index) {
	        // 请求失败时的处理
	    },
	]);
	// 去执行请求,执行之后不会阻塞
	$promise = $pool->promise();
	
	//等待请求完成才能进行后续的代码,会阻塞
	$promise->wait();


这里顺便研究一下guzzle的异步原理,简单的讲,就是将异步操作的具体操作集中到一个队列中,然后注册到register_shutdown_function,在脚本执行完毕时依顺序执行队列中的操作。
register_shutdown_function函数用于注册脚本结束后执行的函数,逻辑上来说,如果你没有调用 $promise->wait();,那么之前的代码只是把要执行的任务加入guzzle的队列中,等到所有的脚本都执行完了就触发了register_shutdown_function,然后再执行队列,给人异步的感觉。用了 $promise->wait();就是手动去调用队列中的任务。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值