web-dev-qa-db-ja.com

cURLエラー28:受信した23000995バイトのうち7276200で、2000ミリ秒後に操作がタイムアウトしました

説明

LaravelプロジェクトでGuzzleを使用しています。巨大なペイロードを返すAPIにリクエストを送信すると、メモリがクラッシュしました。

これはCURL.phpクラスの一番上にあります。 Guzzleを使用するget()があります。

use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
use GuzzleHttp\FORCE_IP_RESOLVE;
use GuzzleHttp\DECODE_CONTENT;
use GuzzleHttp\CONNECT_TIMEOUT;
use GuzzleHttp\READ_TIMEOUT;
use GuzzleHttp\TIMEOUT;

class CURL {

    public static function get($url) {

        $client = new Client();
        $options = [
            'http_errors' => true,
            'force_ip_resolve' => 'v4',
            'connect_timeout' => 2,
            'read_timeout' => 2,
            'timeout' => 2,
        ];
        $result = $client->request('GET',$url,$options);
        $result = (string) $result->getBody();
        $result = json_decode($result, true);
        return $result;

    }

    ...

}

私のアプリケーションでこのように呼び出すと、大きなペイロード(30000)を要求します

$url = 'http://site/api/account/30000';
$response =  CURL::get($url)['data'];

このエラーが発生し続けました

cURLエラー28:受信した23000995バイトのうち7276200で2000ミリ秒後に操作がタイムアウトしました( http://curl.haxx.se/libcurl/c/libcurl-errors.html を参照)

これを回避するにはどうすればよいですか?

これらの設定を増やす必要がありますか?

'connect_timeout' => 2,
'read_timeout' => 2,
'timeout' => 2,
4
cyber8200

はい、read_timeouttimeoutを増やす必要があります。エラーは明らかです。応答を取得するのに十分な時間がありません(サーバーが遅い、ネットワークなどは関係ありません)。

可能であれば、タイムアウトを増やすのが最も簡単な方法です。

サーバーがページネーションをサポートしている場合は、データを部分的に要求するためのより良い方法です。

また、Guzzleで非同期クエリを使用して、APIからの応答を待っている間にエンドユーザーに何かを送信することもできます。

5
Alexey Shokov