我正在使用laravel构建一个Web,它依赖于外部API来获取我向用户显示的数据(在我的案例中为http://eztvapi.re)。我正在使用guzzle进行api调用,它运行正常。
API非常简单,它既可以显示节目列表(包含元数据),也可以显示给定ID的节目信息。
当我需要显示用户已选择为收藏的给定节目的信息时,问题就出现了。这意味着我需要查询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缓存,它似乎只是为了将查询缓存到数据库(或者我可能不太了解文档)。
这是什么方法?
答案 0 :(得分:2)
好的,感谢Dexa的评论我走上正轨。我使用了https://github.com/RemiCollin/GuzzleCache(我最初设置它时遇到了问题,但开发人员帮助了我)。
在对api提出50个请求的页面上,我从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秒它的方式太多,它发生在用户身上。所以我不接受我自己的答案(没有经过足够的测试我认为它可能是解决方案,但我不再这么认为了)