狂饮不要同时发送请求

时间:2019-10-11 00:20:53

标签: php guzzle guzzle6

我正在尝试使用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日志在实际执行请求之后出现,这是不期望的。

我的结果是正确的,但时机不是那么好。

因此,感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

哇,我在Guzzle文档中什么都找不到。

要真正拥有并发请求,您必须安装curl扩展名。

我的PHP-FPM(Ubuntu 19.04)没有安装。安装后,一切正常!

此很棒的小评论的积分:Guzzle async requests not really async?