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

问题描述 投票:0回答:1

我正在使用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查询之前接收第二个URL get查询的响应。任何帮助将不胜感激。

php guzzle
1个回答
0
投票

我终于解决了我的问题。

不确定这是否是最好的方法,但是它能正常工作:我设置了一个全局结果数组,并在每个出栈末尾将结果存储在数组中,然后再调用出队函数以便按升序遍历该数组。最初在结果数组开头的索引标志让我知道像在冒泡排序算法中一样工作的最小非空结果。

© www.soinside.com 2019 - 2024. All rights reserved.