0

次のコードを検討してください。

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 件のリクエストが送信されます。

問題の 1 つは拒否されたセクションです。

'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)"] []

キューに入れられ、それぞれが 10,000 のリクエストを送信する 13 をはるかに超えるジョブがおそらくあるため、これらは大量にあります。

この API のレート制限は、1 秒あたり 150 リクエストです。ですから、150 を達成していないか、少なくともそうすべきではないことはわかっています。

質問は、拒否されたリクエストを再試行するにはどうすればよいですか? 失敗した場合、最大 x 回再試行する方法はありますか? ガズルにはそれが組み込まれていますか?

4

1 に答える 1

1

受信している curl エラーは、サーバー/プロキシ/ファイアウォールのレート制限を示している可能性があります。特に、アプリケーションが 10k のリクエストを投げている場合。エラー自体 (少なくともlibcurlによれば、アプリケーションが応答を受信して​​いないことを示しています。

「ミドルウェアの再試行」または「レート制限ミドルウェア」のいずれかを探していると思います

于 2016-02-01T19:36:28.453 に答える