请教一下guzzle的pool问题
use GuzzleHttp\Pool;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
$stack->push(Middleware::mapRequest(function (RequestInterface $request) {
Log::write(':请求的数据:' . $request->getBody());
return $request;
}));
$client = new Client(['handler' => $stack]);
$requests = function ($total) {
$uri = 'https://www.google.com';
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();
发现一个问题,这个pool并发如果前面的一个阻塞了还没有收到响应,后面的请求并不会被请求出去,我用中间件记录了请求的body来看,前面的请求没执行完后面的不会执行,原本就是这么设计的吗?
用异步请求方法比如getAsync之类的
使用 fiddler 抓包看下请求内容吧 看看是卡在哪个步骤了
guzzle 是支持设置代理的
试试改用
CurlMultiHandler
。准备多点地址试试,如果都是 google,估计 dns,connect 都过不了 方便提供贴一下运行输出的内容吗
你应该看起来好像写的不对哇。给你看看我写的:
pool 相当于把很多请求放在一个array 循环请求,然后看起来是需要之前的请求完成后才会执行后面的请求。
该说不是你想要那种全部请求同时执行
guzzle 的话有专门的方法来做同时请求
不会堵塞。
guzzle
没试过, 我之前用laravel - 并发请求 没问题的。估计是你代码问题,可以用
laravel
文档的测试。CurlMultiHandler支持Guzzle的, 另外题主试试加参timeout