首页 > 解决方案 > 如何使用 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 查询的响应。任何帮助将不胜感激。

标签: phpguzzle

解决方案


我终于解决了我的问题。

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


推荐阅读