【问题标题】:Caching API Data Laravel 5.2缓存 API 数据 Laravel 5.2
【发布时间】:2016-09-05 21:01:18
【问题描述】:

我正在研究 Halo 5 API。我申请了更高的 API 速率限制,我得到的回复之一是:

您能否向我们提供更多详细信息,说明您对 API 进行了哪些调用,以及您是否使用了任何缓存?具体来说,我们建议缓存匹配和事件详细信息以及元数据,因为它们很少更改。

当他们说“你在打哪个电话”时,我得到了这个部分,但缓存部分,我从未使用过。我了解了缓存的基本部分,它可以加速您的 API,但我只是不知道如何在我的 API 中实现它。

我想知道如何在我的应用中缓存一些数据。这是我如何从 API 获得玩家奖牌的基本示例。

路线:

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

    /** Get the Home Page **/
    Route::get('/', 'HomeController@index');


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

});

我的 GetDataController 调用 API Header 来获取玩家奖牌:

<?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)

}

你们知道如何缓存这些数据吗?

(仅供参考,JSON 调用中大约有 189 个不同的奖牌,因此它是一个相当大的 API 调用)。我还阅读了有关 Laravel 缓存的文档,但仍需要澄清。

【问题讨论】:

  • 使用 redis 之类的东西,甚至是 laravel 中的默认缓存系统,您应该能够将结果缓存大约 5-10 分钟,并且显着减少了 api 调用。基本上,您使用类似于会话的Cache 类。创建一个键/值对并让它在一定时间后过期。 laravel.com/docs/5.1/cache
  • 我已阅读文档,但我不明白我会在哪里执行此操作:创建一个键/值对并让它在一定时间后过期

标签: php json laravel caching


【解决方案1】:

你可以使用 Laravel 缓存。

试试这个:

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('medals');
} else {
    app('App\Http\Controllers\GetData\GetDataController')->getPlayerArenaStats($gamertag);
}
...

当然,您需要做得更好,只存储您需要的信息。在此处查看文档:https://laravel.com/docs/5.1/cache

【讨论】:

  • 我做了你所做的,但我得到了这个错误:缓存存储[奖牌]没有定义。
  • 好的,这有助于我更好地理解这一点,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2016-04-20
  • 2016-09-05
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多