我正在尝试使用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-FPM提供的。
每个子请求也记录自己的执行。事情是我在日志中看到这样的东西:
[2019-10-11 02:10:06]生产。调试:过滤器管理器->过滤器 Filter1用了23秒
[2019-10-11 02:10:06] production.DEBUG:过滤器控制器报告-> 过滤器应用\过滤器\过滤器1已触发
[2019-10-11 02:10:17] production.DEBUG:过滤器管理器->过滤器 Filter2用了11秒
[2019-10-11 02:10:17] production.DEBUG:过滤器控制器报告-> 筛选器应用\ Filter \ Filter2已触发
[2019-10-11 02:10:34] production.DEBUG:过滤器管理器->过滤器 Filter3用了17秒
[2019-10-11 02:10:34] production.DEBUG:过滤器控制器报告-> 筛选器应用\ Filter \ Filter3已触发
[2019-10-11 02:10:51] production.DEBUG:过滤器管理器->过滤器 Filter4用了17秒
[2019-10-11 02:10:51] production.DEBUG:过滤器控制器报告-> 筛选器应用\筛选器\已过滤Filter4
[2019-10-11 02:11:09] production.DEBUG:过滤器管理器->过滤器 Filter5用了18秒
[2019-10-11 02:11:09] production.DEBUG:过滤器控制器报告-> 筛选器应用\筛选器\已过滤Filter5
[2019-10-11 02:11:09] production.DEBUG:过滤器控制器报告-> 过滤器花费了86秒
我的过滤器需要10到20秒才能运行,因此我希望整个过滤器请求大约需要20秒。您会看到执行所有请求需要花费所有时间(86秒)。
让我确定它不是同时运行的,是Fire
日志在实际执行请求之后出现,这是不期望的。
我的结果是正确的,但时机不是那么好。
因此,感谢您的帮助!
答案 0 :(得分:1)
哇,我在Guzzle文档中什么都找不到。
要真正拥有并发请求,您必须安装curl
扩展名。
我的PHP-FPM(Ubuntu 19.04)没有安装。安装后,一切正常!
此很棒的小评论的积分:Guzzle async requests not really async?