Как я могу кэшировать изображения с помощью Laravel - PullRequest
0 голосов
/ 13 декабря 2018

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

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

Googleразмещает детали api call получает хеш для изображения, и я могу создать URL для изображения следующим образом:

$photos[] = 'https://maps.googleapis.com/maps/api/place/photo?photoreference=' . 
             $photo->photo_reference . 
            '&sensor=false&maxheight=400&maxwidth=400&key=' . 
             $apiKey;

Изображение затем извлекается и отображается в переднем конце.

Мы используем способ Laravel, делая что-то вроде Cache::get($id.'photos'), но это только кэширует URL, и это не очень полезно.

Мы также нашли следующую ссылку https://github.com/Intervention/imagecache но это репо довольно старое, и мы используем Laravel 5.7, поэтому методы, используемые в этом репо, больше не применимы.

Любые предложения будут высоко оценены!

1 Ответ

0 голосов
/ 15 декабря 2018

Если вы можете загрузить фактическое изображение непосредственно с этого URL, то вы можете пойти по этому пути:

Пользователь запрашивает изображение на вашем URL yourdomain.com/your-api/image/{reference}

  • попробуйте извлечь изображение из кэша (по URL) и вернуть, что, если оно существует
  • else, загрузить изображение в одну из ваших storage папок
  • кэшировать изображение по URL
  • вернуть локальную кэшированную копию изображения
  • Возможно, вы также захотите создать команду, которая удаляет старые изображения из этой папки хранения

Возможнобыть примерно таким (непроверенным)

/** @return \Illuminate\Http\Response */
function getImage($reference) {
    $imageUrl = buildImageUrl($reference);
    $hash = getHash($imageUrl);
    if($location = Cache::get("image-$hash")) {
        if(file_exists($location)) {
            return response()->file($location);
        }
    }

    $location = cacheImage($imageUrl, $hash);
    return response()->file($location);
}

function cacheImage($imageUrl, $hash) {
    $hash = getHash($imageUrl);
    $location = storage_path("images/$hash");

    // download the image and cache its filename by hash
    $image = downloadImage($imageUrl, $location);
    file_put_contents($location, $image);
    Cache::put("image-$hash", $location);

    return $location;
}

function getHash($string) {
    return sha1($string);
}
...