2015-06-24 39 views
3

我正在構建一個依賴於外部API來獲取我向用戶顯示的數據的laravel Web(我的案例中的http://eztvapi.re)。我爲api調用使用guzzle,它工作正常。使用laravel向api發出多個請求

該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緩存,它似乎只是爲了緩存查詢到數據庫(或者我可能不太瞭解文檔)。

這將是什麼適當的方式?

+1

難道這是任何幫助http://guzzle3.readthedocs.org/插件/緩存plugin.html或laravel,這看起來很有前途https://github.com/RemiCollin/GuzzleCache – Dexa

+0

它可以,我會看看如果我能實現它 –

+0

嗯,我用這個:https:/ /github.com/guzzle/cache-subscriber,並且它在加載時間上沒有任何區別。 –

回答

1

好的,得益於Dexa的評論,我得到了正確的軌道。我使用https://github.com/RemiCollin/GuzzleCache(我在開始時遇到了麻煩,但開發者幫助我)。

在一個頁面上有50個對api的請求,我從20秒到200ms。

這是我在結束代碼(函數被調用每一個節目):

<?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秒的時間,而當它沒有被緩存的時候需要20秒,這太多了,它會發生在用戶身上。所以我不會接受我自己的答案(沒有足夠的測試我認爲這可能是解決方案,但我不這麼認爲)

相關問題