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,
はい、read_timeout
とtimeout
を増やす必要があります。エラーは明らかです。応答を取得するのに十分な時間がありません(サーバーが遅い、ネットワークなどは関係ありません)。
可能であれば、タイムアウトを増やすのが最も簡単な方法です。
サーバーがページネーションをサポートしている場合は、データを部分的に要求するためのより良い方法です。
また、Guzzleで非同期クエリを使用して、APIからの応答を待っている間にエンドユーザーに何かを送信することもできます。