你如何处理 guzzle 中的拒绝响应?
How do you deal with rejected responses in guzzel?
考虑以下代码:
public function getItemHistoryForRegion(array $items, array $regions) {
$client = new Client(['expect' => false]);
$acceptedResponses = [];
$rejectedResponses = [];
$createdRequests = [];
$regionAndItem = [];
foreach($items as $item) {
foreach ($regions as $region) {
array_push($regionAndItem, [$item, $region]);
array_push($createdRequests, new Request('GET', 'https://public-crest.eveonline.com/market/'.$region.'/types/'.$item.'/history/'));
}
}
$pool = new Pool($client, $createdRequests, [
'concurrency' => 10,
'fulfilled' => function ($response, $index) use (&$acceptedResponses) {
EveLogHandler::requestLog($response, 'eve_online_region_item_history_responses.log');
$acceptedResponses[$index] = json_decode($response->getBody()->getContents());
},
'rejected' => function ($reason, $index) use(&$rejectedResponses) {
EveLogHandler::messageLog($reason, 'eve_online_region_item_history_rejected_responses.log');
},
]);
$promise = $pool->promise();
$promise->wait();
$historyDetails = new HistoryDetails($acceptedResponses, $regionAndItem);
$historyDetails->createHistoryDetails();
return $historyDetails->getHistoryDetails();
}
我创建了一个请求数组,然后将它们汇集在一起。通常有 10,000 个请求通过这里。
其中一个问题是被拒绝的部分:
'rejected' => function ($reason, $index) use(&$rejectedResponses) {
EveLogHandler::messageLog($reason, 'eve_online_region_item_history_rejected_responses.log');
},
这里我只是注销了被拒绝的消息,它返回为:
[2016-01-27 16:35:00] production.INFO: Message ["[object] (GuzzleHttp\Exception\ConnectException(code: 0): cURL error 52: Empty reply from server (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) at /home/ccccc/test_site/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:186)"] []
[2016-01-27 16:35:57] production.INFO: Message ["[object] (GuzzleHttp\Exception\ConnectException(code: 0): cURL error 52: Empty reply from server (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) at /home/ccccc/test_site/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:186)"] []
其中有很多,因为可能有超过 13 个作业排队,每个作业发送 10,000 个请求,正如你所看到的,我将它们集中在一起,所以我一次处理 10 个。
此 api 的速率限制为每秒 150 个请求。所以我知道我没有达到 150,或者至少我不应该。
我要问你的问题是如何重试被拒绝的请求?有没有办法说,失败时最多重试 x 次? guzzle 有内置的吗?
您收到的卷曲错误可能表明服务器/代理/防火墙限制了您的速率;特别是如果您的应用程序向其发出 10k 请求。错误本身(至少根据 libcurl 表明您的应用程序未收到响应。
我相信您会寻找 "retry middleware" 或 "rate limiting middleware"
考虑以下代码:
public function getItemHistoryForRegion(array $items, array $regions) {
$client = new Client(['expect' => false]);
$acceptedResponses = [];
$rejectedResponses = [];
$createdRequests = [];
$regionAndItem = [];
foreach($items as $item) {
foreach ($regions as $region) {
array_push($regionAndItem, [$item, $region]);
array_push($createdRequests, new Request('GET', 'https://public-crest.eveonline.com/market/'.$region.'/types/'.$item.'/history/'));
}
}
$pool = new Pool($client, $createdRequests, [
'concurrency' => 10,
'fulfilled' => function ($response, $index) use (&$acceptedResponses) {
EveLogHandler::requestLog($response, 'eve_online_region_item_history_responses.log');
$acceptedResponses[$index] = json_decode($response->getBody()->getContents());
},
'rejected' => function ($reason, $index) use(&$rejectedResponses) {
EveLogHandler::messageLog($reason, 'eve_online_region_item_history_rejected_responses.log');
},
]);
$promise = $pool->promise();
$promise->wait();
$historyDetails = new HistoryDetails($acceptedResponses, $regionAndItem);
$historyDetails->createHistoryDetails();
return $historyDetails->getHistoryDetails();
}
我创建了一个请求数组,然后将它们汇集在一起。通常有 10,000 个请求通过这里。
其中一个问题是被拒绝的部分:
'rejected' => function ($reason, $index) use(&$rejectedResponses) {
EveLogHandler::messageLog($reason, 'eve_online_region_item_history_rejected_responses.log');
},
这里我只是注销了被拒绝的消息,它返回为:
[2016-01-27 16:35:00] production.INFO: Message ["[object] (GuzzleHttp\Exception\ConnectException(code: 0): cURL error 52: Empty reply from server (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) at /home/ccccc/test_site/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:186)"] []
[2016-01-27 16:35:57] production.INFO: Message ["[object] (GuzzleHttp\Exception\ConnectException(code: 0): cURL error 52: Empty reply from server (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) at /home/ccccc/test_site/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:186)"] []
其中有很多,因为可能有超过 13 个作业排队,每个作业发送 10,000 个请求,正如你所看到的,我将它们集中在一起,所以我一次处理 10 个。
此 api 的速率限制为每秒 150 个请求。所以我知道我没有达到 150,或者至少我不应该。
我要问你的问题是如何重试被拒绝的请求?有没有办法说,失败时最多重试 x 次? guzzle 有内置的吗?
您收到的卷曲错误可能表明服务器/代理/防火墙限制了您的速率;特别是如果您的应用程序向其发出 10k 请求。错误本身(至少根据 libcurl 表明您的应用程序未收到响应。
我相信您会寻找 "retry middleware" 或 "rate limiting middleware"