使用 laravel 向 api 发出多个请求
Making multiple requests to an api using laravel
我正在使用 laravel 构建一个网络,它依赖于外部 API 来获取我向用户显示的数据(在我的例子中是 http://eztvapi.re)。我在 api 调用中使用 guzzle,它工作正常。
API 非常简单,它要么显示节目列表(带有它们的元数据),要么显示给定节目 ID 的节目信息。
当我需要显示信息时,问题就来了,比方说,给定的 15 个显示用户已选择最喜欢的显示。这意味着我需要查询 API 15 次,每个节目查询一次,这会大大降低网络速度(而且对 API 的请求太多,这对我来说似乎不合适) .
基本上是这样的:
foreach ($favorites as $fav) {
$client = new Client();
$res = $client->get('http://eztvapi.re/show/'.$fav->id);
$show = $res->json();
}
我考虑过将 api 的内容复制到我的数据库中,但这完全违背了连接到 api 的目的,而且需要非常频繁地更新它。我想也许缓存是要走的路,但我不清楚如何接近那条路线,我搜索了 laravel 缓存,它似乎只是为了缓存对数据库的查询(或者我可能没有很好地理解文档)。
正确的方法是什么?
好的,多亏了 Dexa 的评论,我才走上正轨。我使用了 https://github.com/RemiCollin/GuzzleCache(我一开始设置时遇到了问题,但开发人员帮助了我)。
在一个有 50 个请求的页面上 api 我从 20 秒减少到 200 毫秒。
这是我最后的代码(每个节目都会调用该函数):
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
use \GuzzleHttp\Client;
use GuzzleCache;
class Show extends Model {
/* .. other functions .. */
public function getShowInfo(){
$id = $this->imdb;
$client = GuzzleCache::client(['base_url' => 'http://eztvapi.re']);
$res = $client->get('http://eztvapi.re/show/'.$id);
$show = $res->json();
return $show;
}
}
编辑:对于某些 api 来说,这将是一个足够好的解决方案,但在我的情况下,这个 api 更新非常频繁,当它不被加载时需要 20 秒缓存它太多了,它会发生在用户身上。所以我不会接受我自己的答案(没有足够的测试我认为它可能是解决方案但我不再这么认为)
我正在使用 laravel 构建一个网络,它依赖于外部 API 来获取我向用户显示的数据(在我的例子中是 http://eztvapi.re)。我在 api 调用中使用 guzzle,它工作正常。
API 非常简单,它要么显示节目列表(带有它们的元数据),要么显示给定节目 ID 的节目信息。
当我需要显示信息时,问题就来了,比方说,给定的 15 个显示用户已选择最喜欢的显示。这意味着我需要查询 API 15 次,每个节目查询一次,这会大大降低网络速度(而且对 API 的请求太多,这对我来说似乎不合适) .
基本上是这样的:
foreach ($favorites as $fav) {
$client = new Client();
$res = $client->get('http://eztvapi.re/show/'.$fav->id);
$show = $res->json();
}
我考虑过将 api 的内容复制到我的数据库中,但这完全违背了连接到 api 的目的,而且需要非常频繁地更新它。我想也许缓存是要走的路,但我不清楚如何接近那条路线,我搜索了 laravel 缓存,它似乎只是为了缓存对数据库的查询(或者我可能没有很好地理解文档)。
正确的方法是什么?
好的,多亏了 Dexa 的评论,我才走上正轨。我使用了 https://github.com/RemiCollin/GuzzleCache(我一开始设置时遇到了问题,但开发人员帮助了我)。
在一个有 50 个请求的页面上 api 我从 20 秒减少到 200 毫秒。
这是我最后的代码(每个节目都会调用该函数):
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
use \GuzzleHttp\Client;
use GuzzleCache;
class Show extends Model {
/* .. other functions .. */
public function getShowInfo(){
$id = $this->imdb;
$client = GuzzleCache::client(['base_url' => 'http://eztvapi.re']);
$res = $client->get('http://eztvapi.re/show/'.$id);
$show = $res->json();
return $show;
}
}
编辑:对于某些 api 来说,这将是一个足够好的解决方案,但在我的情况下,这个 api 更新非常频繁,当它不被加载时需要 20 秒缓存它太多了,它会发生在用户身上。所以我不会接受我自己的答案(没有足够的测试我认为它可能是解决方案但我不再这么认为)