我正在尝试使用Guzzle发出一些并发的请求。代码:
// Imports
use GuzzleHttp\Pool;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request as PSR7Request;
// Part of code that I have problem with
$client = new Client([
'timeout' => 100
]);
$requests = function ($filters, $carbon_date) {
foreach ($filters as $filter) {
yield new PSR7Request('GET', route('filters.run', ['filter' => $filter, 'date' => $carbon_date->format('Y/m/d')]));
Log::debug("Filter Controller Report -> Filter {$filter} fired");
}
};
$result = collect();
$pool = new Pool($client, $requests($filters, $carbon_date), [
'concurrency' => 10,
'fulfilled' => function ($response) use (&$result) {
$result = $result->merge(json_decode($response->getBody(), true));
},
'rejected' => function ($reason, $index) {
Log::error("Filter Controller Report -> A filter has failed", compact('reason'));
}
]);
$pool->promise()->wait();我使用的是Laravel,这个代码在控制器内。
代码是通过NGINX+PHP提供的。
每个子请求也会记录自己的执行情况。问题是我在日志里看到了这样的东西:
2019-10-11 02:10:06 production.DEBUG: Filter Manager -> Filter Filter1花了23秒
2019-10-11 02:10:06 production.DEBUG: Filter Controller报告-> Filter App\Filter\Filter 1已启动
2019年-10- 11 02:10:17 production.DEBUG: Filter Manager -> Filter Filter2用了11秒钟
2019-10-11 02:10:17 production.DEBUG: Filter Controller Report -> Filter App\Filter 2已启动
2019年-10-11 02:10:34 production.DEBUG: Filter Manager -> Filter Filter3花了17秒钟
2019-10-11 02:10:34 production.DEBUG: Filter Controller报告-> Filter App\Filter\Filter 3已启动
2019年-10-11 02:10:51 production.DEBUG: Filter Manager -> Filter Filter4花了17秒钟
2019-10-11 02:10:51 production.DEBUG: Filter Controller Report -> Filter App\Filter\Filter 4已启动
2019年-10-11 02:11:09 production.DEBUG: Filter Manager -> Filter Filter5用了18秒
2019-10-11 02:11:09 production.DEBUG: Filter Controller Report -> Filter App\Filter\Filter 5已启动
2019年-10-11 02:11:09 production.DEBUG: Filter Controller报告->过滤器花费86秒
我的过滤器需要10~20秒才能运行,所以我希望过滤器的整个请求大约需要20秒。您可以看到执行所有请求所需的时间之和(86秒)。
让我确信它不是并发运行的是,Fire日志出现在请求的实际执行之后,这并不是预期的。
我的结果是正确的,但时机不太好。
所以,任何帮助都是非常感谢的!
发布于 2019-10-11 00:29:33
哇,我在口香糖文件里找不到任何关于这个的东西。
要真正拥有并发请求,您必须安装curl扩展。
我的PHP(Ubuntu19.04)没有安装它。安装完毕后,一切正常!
归功于这个令人敬畏的小小评论:Guzzle async requests not really async?
https://stackoverflow.com/questions/58332671
复制相似问题