Запрос ресурсов изображения из внешнего API с помощью прокси

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


person alithedeveloper    schedule 26.11.2017    source источник
comment
Вы рассматривали кеширование в этом случае?   -  person Leo    schedule 26.11.2017
comment
Да, я правильно использую кеширование после вызова, однако первый вызов стоит дорого, так как я получаю массив объектов в первый раз, а затем каждый объект имеет определенные изображения, и их нужно получить. надеюсь, что это имеет смысл   -  person alithedeveloper    schedule 26.11.2017


Ответы (1)


Я нашел решение своей проблемы и отправлю ответ. Имейте в виду, есть лучшие решения, то есть настройка вашего сервера для обработки таких вызовов. Однако в контексте Laravel я сделал вот что.

Данные, с которыми мне пришлось работать

[
      "orientation" => "portrait"
      "fig_type" => "diagram"
      "id" => "A_SDEF-05-2016-0003001"
      "position" => "float"
      "label" => "Figure 1."
      "caption" => "some caption"
      "link" => "/resource/id/A_SDEF-05-2016-0003001.tif"
   ]

Решение :

Шаг 1 Прокрутите данные, используя коллекции в Laravel, как и в его функции;

// Pass the link as a get request parameter to laravel route
// i.e. localhost/proxy/image?link=resource/id/A_SDEF-05-2016-0003001.tif
return collect($images)->each(function ( $image ) 
{
        if ($image['link']) {
            $image['link'] = ltrim($image['link'],'/');
            return $image['link'] ="link={$image['link']}";
        }
        return $image;
 });

Шаг 2 Зарегистрируйте конечную точку в файле маршрутов, например.

Route::get('/proxy/image', 'ProxyController@request_image');

Шаг 3 Метод контроллера, то есть request_image, делает запрос Guzzle и возвращает ответ в виде:

$link = request('link');

return \Response::stream(function() use($image){
        echo $image;
    },200, [$headers]);

Шаг 4 Имейте статическую функцию или обычную функцию для вывода некоторого динамического HTML, который вы создадите, однако в img src вы должны вызвать метод изображения ProxyController, т.е.

  $img = '<img src="'. action('ProxyController@request_image',$image['link']).'") >";

-Шаг 5 Выведите HTML-код в лезвие

{!! Asset::image($image) !!} // Just output the built html

Надеюсь, это поможет: D

person alithedeveloper    schedule 26.11.2017