使用带有Laravel的Intervention / ImageCache清除图像所有操作的缓存

时间:2014-10-13 08:15:51

标签: php caching laravel

我正在尝试找出一种方法来清除使用Intervention / ImageCache的操作模板创建的图像的所有操作的缓存(以及将来可能的缓存功能)。

我有一些操作模板在图像上运行自定义过滤器:

'thumbnail' => function($image) {
    return $image->filter(new ImageFilters\Fit(150));
},

过滤器从数据库中获取焦点,然后根据需要使用位置的焦点运行相应的函数。

public function applyFilter(Image $image)
{
    $fp = Media::where('file_name', $image->filename)->pluck('focal_point');
    $fp = $fp ?: 'center';
    return $image->fit($this->width, $this->height, function(){return true;}, $fp);
}

这一切都很好,但是当用户更改焦点时,由于缓存,图像不会更新。我需要一种清除特定图像的缓存的方法。

据我所知,每个被操纵的图像都有自己独特的缓存键,由md5哈希组成,但我找不到任何方法来定位单个图像的所有操作。

2 个答案:

答案 0 :(得分:3)

即使问题在过去,我也想提出一个解决方案:

// get an instance of the ImageCache class
$imageCache = new \Intervention\Image\ImageCache();

// get a cached image from it and apply all of your templates / methods
$image = $imageCache->make($pathToImage)->filter(new TemplateClass);

// remove the image from the cache by using its internal checksum
Cache::forget($image->checksum());

每当您对图像进行更改时都会执行此行,这会影响应用的滤镜(例如焦点)。 请求缓存的图像时,将使用新值再次创建它。

希望这有帮助, 理查德

答案 1 :(得分:2)

无法清除一个图像的缓存。 focal_point的字符串必须在回调签名中,才能在缓存中生效。

您可以通过GET参数将其添加到Filter中来执行此操作。

'thumbnail' => function($image) {
    $fp = Input::get('fp', 'center');
    return $image->filter(new ImageFilters\Fit(150, $fp));
},

然后请求您的图像:

/imagecache/thumbnail/foo.jpg?fp=center