我如何使用Laravel缓存图像

时间:2018-12-13 20:32:40

标签: php laravel laravel-5 google-places-api

我想在Laravel中缓存图像。我能找到我在哪里为自己提供图片的所有解决方案,但这些图片来自Google Places api调用。从地点详细信息api调用。

因此,如果用户请求使用我的Web应用程序的某个位置的图像,我想怎么做,我想缓存作为结果检索到的图像。

google place details api调用检索图像的哈希,我可以像这样构造图像的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 :(得分:1)

如果您可以直接从该URL下载实际图像,则可以采用这种方式:

  

用户在您的网址yourdomain.com/your-api/image/{reference}上请求图像

  • 尝试从缓存中获取图片(通过URL)并返回(如果存在)
  • 否则,将图像下载到您的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);
}