有个需求需要批量请求接口,于是想到了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();就是手动去调用队列中的任务。