【问题标题】:How do you deal with rejected responses in guzzel?您如何处理 guzzle 中的拒绝响应?
【发布时间】:2016-05-04 18:23:42
【问题描述】:

考虑以下代码:

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 有内置的吗?

【问题讨论】:

    标签: php curl guzzle guzzle6


    【解决方案1】:

    您收到的 curl 错误可能表明服务器/代理/防火墙速率限制了您;特别是如果您的应用程序向其抛出 10k 个请求。错误本身(至少根据libcurl 表明您的应用程序没有收到响应。

    我相信您会寻找“重试中间件”或“限速中间件”

    【讨论】:

    • 如果我达到速率限制,他们会使用 503,我正在做 18-20 个他们允许的并发连接,我一次做 100 个而不是 10k(我将 10k 分成 100 个)
    猜你喜欢
    • 2012-04-02
    • 2019-11-25
    • 2017-02-22
    • 2016-05-12
    • 2014-07-15
    • 2020-10-05
    • 1970-01-01
    • 2018-06-21
    • 2019-05-15
    相关资源
    最近更新 更多