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