2015-06-24 3 views
3

Я создаю веб-сайт с laravel, который полагается на внешний API, чтобы получить данные, которые я показываю своим пользователям (http://eztvapi.re в моем случае). Я использую жужжание для вызовов api, и он отлично работает.Выполнение нескольких запросов на api с использованием laravel

API очень прост, он либо отображает список шоу (с метаданными для них), либо информацию одного шоу с указанием его идентификатора.

Проблема возникает, когда мне нужно показать информацию, например, 15 приведенных показов, которые пользователь выбрал в качестве избранного. Это означает, что мне нужно запрашивать API 15 раз, по одному для каждого шоу, и это сильно замедляет работу в Интернете (слишком много запросов для API, что мне кажется не прав).

В основном это:

foreach ($favorites as $fav) { 
    $client = new Client(); 
    $res = $client->get('http://eztvapi.re/show/'.$fav->id); 
    $show = $res->json(); 
} 

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

Что было бы правильным способом для этого?

+1

Может ли это быть любой помощью http://guzzle3.readthedocs.org/ plugins/cache-plugin.html или для laravel, это выглядит многообещающим https://github.com/RemiCollin/GuzzleCache – Dexa

+0

Может, я посмотрю, смогу ли я его реализовать –

+0

Mmmh, я использовал это: https://github.com/guzzle/cache-subscriber, и это не повлияло на время загрузки. –

ответ

1

Хорошо, спасибо комментарию Дексы, что я попал на правильный путь. Я использовал https://github.com/RemiCollin/GuzzleCache (у меня были проблемы с настройкой сначала, но разработчик помог мне).

На странице с 50 запросами на api я пошел от 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; 
    } 

} 

EDIT: Это было бы достаточно хорошим решением для некоторых APIs, но в моем случае это апи обновляется довольно часто, и 20 секунд, которые требуется загрузить, когда он не кэшируется, это слишком много, и это произойдет с пользователем. Поэтому я не собираюсь принимать свой собственный ответ (без достаточного тестирования, я думал, что это может быть решение, но я не думаю, что это так)

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