php - 如何使用 guzzle 发送具有超时限制的并发请求?

标签 php curl asynchronous guzzle

我正在使用 Guzzle 6 发送这样的并发请求:

public function sendConcurrentRequests() {

    $client = new Client(['timeout' => 5]);

    $promises[] = $client->getAsync('http://example.com/1');
    $promises[] = $client->getAsync('http://example.com/2');
    $promises[] = $client->getAsync('http://example.com/3');

    $results = Promise\unwrap($promises);  

    return $results;
}

每个请求可能需要 1 到 10 秒,但我不希望任何请求等待超过 5 秒(这就是我设置超时的原因)。我希望会发生的是:

  • 请求 1、2 和 3 已启动
  • 请求2耗时超过5秒,取消请求,返回及时响应的请求1和3的响应

这是实际发生的事情: - 请求 1、2 和 3 已启动 - 请求 2 花费的时间超过 3 秒,因此解包函数抛出 ConnectException,我无法从请求 1 和 3 获得响应。

我怎样才能使这项工作有效,以便我能够从及时返回的请求中获得有效响应?

最佳答案

我在写完问题之前就找到了答案,但我想我还是会发布它以防它能帮助到其他人。

解决方案是替换这个调用:

$results = Promise\unwrap($promises);

有了这个:

$results = Promise\settle($promises)->wait(true);

如果 promise 被拒绝,settle 函数将不会抛出异常,从而允许您获得完整的响应数组(包括已完成和已拒绝的响应)。

关于php - 如何使用 guzzle 发送具有超时限制的并发请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36347457/

相关文章:

c# - 任务异步困惑

javascript - HTML 提交表单仅在提交时执行一个 JavaScript 函数

javascript - 如何使用 longblob 列将输入图像保存在数据库中?

php - 带有 PDFtk(PHP laravel 后端)的 Azure Web 应用程序

php - Curl 输入 php 和 IP 地址

php - cURL 和 PHP : Stop output to screen

php - OPcache 不缓存任何东西

curl - 如何在通过 curl 触发构建时设置 Jenkins 构建描述?

javascript - Mocha 未处理的拒绝断言错误

javascript - 如何将 Child_process.spawn 的 "Promise"语法转换为 "async/await"语法