如何提高加载大数据作为响应的HTTP get请求的速度



我有这个代码与一个while循环超过1000个记录的API的限制通过合并所有的数组在一个数组中的响应和传递给视图,但它需要太长的等待时间,有没有更好的方法来做到这一点,并加快过程?
这是我的代码

public function guzzleGet()
{
$aData = [];
$sCursor = null;
while($aResponse = $this->guzzleGetData($sCursor))
{
if(empty($aResponse['data']))
{
break;
}
else
{
$aData = array_merge($aData, $aResponse['data']);
if(empty($aResponse['meta']['next_cursor']))
{
break;
}
else
{
$sCursor = $aResponse['meta']['next_cursor'];
}
}
}

$user = Auth::user()->name;
return view("".$user."/home")->with(['data' => json_encode($aData)]);

}
protected function guzzleGetData($sCursor = null)
{
$client = new GuzzleHttpClient();
$token = 'token';

$response = $client->request('GET', 'https://data.beneath.dev/v1/user/project/table', [
'headers' => [
'Authorization' => 'Bearer '.$token,
],
'query' => [
'limit' => 1000,
'cursor' => $sCursor
]
]);
if($response->getBody())
{
return json_decode($response->getBody(), true) ?: [];
}
return [];
}

您必须调试瓶颈在哪里。如果它慢的原因是你的网络/带宽,那么这可能就是问题所在。也可能是API限制了你的下载速度。

另一个瓶颈可能是客户机的下载速度。由于您正在构建一个大数组,当服务器将其发送给客户端时,它需要下载它,并且可能需要花费一些时间。

您可以通过重用相同的curl处理程序或guzzle客户机来潜在地提高速度。另一个你可以改进的地方是array_merge,你可以使用你自己的自定义逻辑:https://stackoverflow.com/a/23348715/8485567.

如果你有外部API的控制权,确保使用gzip和HTTP/2,甚至可能使用gRPC而不是HTTP。

但是我建议你在客户端使用JS这样做,这样你就可以避免客户端从服务器下载它所需要的额外带宽。您可以使用限制1000的相同方法,或者甚至可以在响应传入时流式传输并呈现它。

最新更新