我在Laravel项目中使用Guzzle。 当我向返回巨大负载的API发出请求时,我遇到了内存崩溃。
我在CURL.php
课程的顶部。
我得到()我使用guzzle。
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:操作在2000毫秒后超时,收到23000995字节中的7276200(参见http://curl.haxx.se/libcurl/c/libcurl-errors.html)
我该如何避免这种情况?
我应该增加这些设置吗?
'connect_timeout' => 2,
'read_timeout' => 2,
'timeout' => 2,
如何继续进行调试?
我现在可以接受任何建议。
任何提示/建议/帮助都将非常感谢!
答案 0 :(得分:3)
是的,您需要增加read_timeout
和timeout
。错误很明显,你没有足够的时间来获得响应(服务器很慢,网络或其他东西,无所谓)。
如果可能,增加超时是最简单的方法。
如果服务器支持分页,则可以更好地逐个部分地请求数据。
此外,您可以在Guzzle中使用异步查询,并在等待API响应时向最终用户发送内容。