【发布时间】:2018-11-13 13:07:52
【问题描述】:
如何使用 Guzzle 6 在以下条件下创建 5 个异步请求:
- 所有请求同时开始
- 我希望所有请求的超时值为 500 毫秒。如果请求超时,我不希望它中断其他请求
- 如果请求返回非 200,我不希望它中断其他请求。
- 所有请求都在不同的域上...(所以我不确定这与
base_uri设置是否相符...
如果所有 5 个请求都返回 200OK
但是,如果说其中 2 个没有 200 并且其中 1 个超时(超过 500 毫秒),我希望仍然能够访问 2 个成功的响应。
编辑到目前为止一切正常,除了超时仍然引发异常
这是我目前所拥有的:
<?php
require __DIR__.'/../vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Promise;
$client = new Client([
'http_errors' => false,
'connect_timeout' => 1.50, //////////////// 0.50
'timeout' => 2.00, //////////////// 1.00
'headers' => [
'User-Agent' => 'Test/1.0'
]
]);
// initiate each request but do not block
$promises = [
'success' => $client->getAsync('https://httpbin.org/get'),
'success' => $client->getAsync('https://httpbin.org/delay/1'),
'failconnecttimeout' => $client->getAsync('https://httpbin.org/delay/2'),
'fail500' => $client->getAsync('https://httpbin.org/status/500'),
];
// wait on all of the requests to complete. Throws a ConnectException if any
// of the requests fail
$results = Promise\unwrap($promises);
// wait for the requests to complete, even if some of them fail
$results = Promise\settle($promises)->wait();
【问题讨论】:
-
你看过stackoverflow answer或Guzzle doc吗?如果请求成功,则返回一个
Guzzle\Http\Message\Response对象数组。 “单个请求失败不会导致整个请求池失败。传输请求池时引发的任何异常都将汇总为Guzzle\Common\Exception\MultiTransferException异常。“这是他们文档中的评论。 -
是的,我只是想让它不会引发异常,其他请求可以正常继续。我将使用我拥有的最新版本更新我的代码
-
谢谢我看那个答案,虽然我不经常使用 PHP,所以这有点让人头疼。
-
所以目前,如果 5 个请求中的任何一个以 500 失败,则整个响应都会失败。如何让每个请求静默失败,以便我可以在成功响应时返回 200 OK?
-
所以我可以使用
'http_errors' => false... 剩下的唯一事情是超时仍然会引发异常