【问题标题】:How to get execute query asynchronously and process them in correct order with Guzzle?如何使用 Guzzle 异步获取执行查询并按正确顺序处理它们?
【发布时间】:2020-01-14 04:27:32
【问题描述】:

我使用的是 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查询的响应。 任何帮助将不胜感激。

【问题讨论】:

  • 不确定这如何适用于您的案例,但您是否尝试过阅读 guzzle 文档。这部分似乎特别符合您的用例,也就是迭代地解决承诺:github.com/guzzle/…
  • 这似乎不能解决我的问题。当我想异步和并行执行它们时,这将迫使我按顺序执行所有请求,在我的 doWork 函数中使用它们之前按索引对它们进行排序,然后对一组新请求重复相同的逻辑,直到不再有...
  • 您是否尝试过将并发参数设置为 1,所以它会按顺序 1 接 1 处理承诺。我从这个答案中得到了这个stackoverflow.com/questions/40242226/…
  • 是的,我已经尝试过了,但是即使所有请求都是按组启动的,我也没有可能检索到订购的结果...例如,我收到了请求的结果2,然后是 3,然后是 4,最后是请求 1 的结果……我期待一个解决方案,允许我按此顺序处理响应 1、2、3、4。

标签: php guzzle


【解决方案1】:

我终于解决了我的问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2021-09-15
    • 2018-09-16
    相关资源
    最近更新 更多