使用laravel向api发出多个请求

时间:2015-06-24 09:47:04

标签: php api laravel laravel-5 guzzle

我正在使用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缓存,它似乎只是为了将查询缓存到数据库(或者我可能不太了解文档)。

这是什么方法?

1 个答案:

答案 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秒它的方式太多,它发生在用户身上。所以我不接受我自己的答案(没有经过足够的测试我认为它可能是解决方案,但我不再这么认为了)