2016-05-10 4 views
0

Я работаю над API Halo 5. Я обратился, чтобы получить более высокий предел скорости для API, и один из ответов я получил это:Данные кэширования API Laravel 5.2

Can you please provide us more details about which calls you’re making to the APIs and if you’re using any caching? Specifically we would recommend caching match and event details and metadata as those rarely change.

я часть, когда они говорят «который называет вы делаете», но кэширование части, Я никогда с этим не работал. Я получаю основные части кеширования, что ускоряет ваш API, но я просто не знаю, как реализовать его в моем API.

Я хотел бы знать, как кэшировать некоторые данные в моем приложении. Вот основной пример того, как я получу игровые медали из API.

Маршрут:

Route::group(['middleware' => ['web']], function() { 

    /** Get the Home Page **/ 
    Route::get('/', '[email protected]'); 


    /** Loads ALL the player stats, (including Medals, for this example) **/ 
    Route::post('/Player/Stats', [ 
     'as' => 'player-stats', 
     'uses' => '[email protected]' 
    ]); 

}); 

Мой GetDataController вызвать API заголовок, чтобы получить игроков Медали:

<?php 

namespace App\Http\Controllers\GetData; 

use Psr\Http\Message\RequestInterface; 
use Psr\Http\Message\ResponseInterface; 
use Psr\Http\Message\UriInterface; 

use GuzzleHttp; 
use App\Http\Controllers\Controller; 

class GetDataController extends Controller { 


    /** 
    * Fetch a Players Arena Stats 
    * 
    * @param $gamertag 
    * @return mixed 
    */ 
    public function getPlayerArenaStats($gamertag) { 

     $client = new GuzzleHttp\Client(); 

     $baseURL = 'https://www.haloapi.com/stats/h5/servicerecords/arena?players=' . $gamertag; 

     $res = $client->request('GET', $baseURL, [ 
      'headers' => [ 
       'Ocp-Apim-Subscription-Key' => env('Ocp-Apim-Subscription-Key') 
      ] 
     ]); 

     if ($res->getStatusCode() == 200) { 
      return $result = json_decode($res->getBody()); 
     } elseif ($res->getStatusCode() == 404) { 
      return $result = redirect()->route('/'); 
     } 

     return $res; 
    } 

} 

Мой MedalController, чтобы получить медали от игрока:

<?php 

namespace App\Http\Controllers; 

use GuzzleHttp; 
use App\Http\Controllers\Controller; 

class MedalController extends Controller { 



    public function getArenaMedals($playerArenaMedalStats) { 

     $results = collect($playerArenaMedalStats->Results[0]->Result->ArenaStats->MedalAwards); 

     $array = $results->sortByDesc('Count')->map(function ($item, $key) { 
      return [ 
       'MedalId' => $item->MedalId, 
       'Count' => $item->Count, 
      ]; 
     }); 

     return $array; 
    } 


} 

И это функция отображения медалей Игроков в поле зрения:

public function index(Request $request) { 

     // Validate Gamer-tag 
     $this->validate($request, [ 
      'gamertag' => 'required|max:16|min:1', 
     ]); 

     // Get the Gamer-tag inserted into search bar 
     $gamertag = Input::get('gamertag'); 




     // Get Players Medal Stats for Arena 
     $playerArenaMedalStats = app('App\Http\Controllers\GetData\GetDataController')->getPlayerArenaStats($gamertag); 
     $playerArenaMedalStatsArray = app('App\Http\Controllers\MedalController')->getArenaMedals($playerArenaMedalStats); 
     $arenaMedals = json_decode($playerArenaMedalStatsArray, true); 



     return view('player.stats') 
      ->with('arenaMedals', $arenaMedals) 

} 

Вы, ребята, знаете, как кешировать эти данные?

(FYI, есть около 189 различных медалей от звонка JSON, поэтому его довольно большой вызов API). Я также прочитал документацию о кешировании для Laravel, но все еще нуждаюсь в разъяснении.

+1

Используя что-то вроде redis или даже системы кэширования по умолчанию в laravel, вы сможете кэшировать результаты в течение 5-10 минут и видеть значительное сокращение вызовов api. В принципе, вы используете класс 'Cache', похожий на сеанс. Создайте пару ключ/значение и истечет через определенное время. https://laravel.com/docs/5.1/cache – jardis

+0

Я прочитал документацию, но я не понимаю, где бы я это сделал: ** Создайте пару ключ/значение и истечет через определенное количество времени ** – David

ответ

4

Вы можете использовать Laravel Cache.

Попробуйте это:

public function getPlayerArenaStats($gamertag) { 
.... some code .... 
    $res = $client->request('GET', $baseURL, [ 
     'headers' => [ 
      'Ocp-Apim-Subscription-Key' => env('Ocp-Apim-Subscription-Key') 
     ] 
    ]); 
    Cache::put('medals', $res, 30); //30 minutes 
    .... more code... 
} 

public function index(Request $request) { 
... 
if (Cache::has('medals')) { 
    $playerArenaMedalStats = Cache::get('medal'); 
} else { 
    app('App\Http\Controllers\GetData\GetDataController')->getPlayerArenaStats($gamertag); 
} 
... 

Конечно, вам нужно будет сделать лучше, чем это, чтобы хранить только ту информацию, что вам нужно. Проверьте документы здесь: https://laravel.com/docs/5.1/cache

+0

Я сделал то, что вы сделали, но я получаю эту ошибку: ** Кэш-магазин [медали] не определен. ** – David

+0

отредактирован, посмотрите –

+0

Хорошо, это помогло мне понять это лучше, спасибо. – David

Смежные вопросы