如何异步执行查询并使用 Guzzle 按正确顺序处理它们?

How to get execute query asynchronously and process them in correct order with Guzzle?

我正在使用 Guzzle 版本 6,我想以异步方式并行发送我的所有请求,并按照与查询相同的顺序对响应进行一些处理。

例如,如果我查询url-1到url-8,我想异步让前四个查询(url-1到url -4) 以任意顺序解析,然后按正确的升序处理 url-response-body-1 到 url-response-body-4。然后接下来的四个查询(url-5 到 url-8)也将异步解析等等...

我知道我可以以任何方式将我的查询的所有响应存储在内存中,然后在进行所有查询时处理它们,但我希望能够占用少量内存和低延迟代码。

这里是我目前使用的代码:

$url_arr = array("/home_search.php?q=criteria1","/home_search.php?q=criteria2","/home_search.php?q=criteria3","/home_search.php?q=criteria4","/home_search.php?q=criteria5","/home_search.php?q=criteria6");

$promises = (function () use ($url_arr,$client) {
  foreach ($url_arr as $uri) {
    // don't forget using generator
    yield  $client->getAsync( $uri);        
  }
})();

$eachPromise = new EachPromise($promises, [
  // how many concurrency we are use
  'concurrency' => 4,
  'fulfilled' => function (Response $response) {
     doMyWork($response->getBody());
    },
  'rejected' => function ($reason) {
    // handle promise rejected here
  }
]);
$eachPromise->promise()->wait();

问题在于函数 doMyWork 以任何顺序接收响应,例如,它有时会在第一个之前收到第二个 url get 查询的响应。 非常感谢任何帮助。

我终于解决了我的问题。

不确定这是否是最好的方法,但它有效:我设置了一个全局结果数组,并在调用出列函数之前在每个承诺的末尾将结果累积在数组中,以便遍历数组升序。最初位于结果数组开头的索引标志让我知道要处理的最小非空结果有点像冒泡排序算法。