如何在Laravel中缓存来自url的图像

时间:2015-01-26 22:54:05

标签: php laravel-4

我有一个Laravel 4应用程序,它显示位于远程服务器上的另一个PHP应用程序的图像。

我想知道在我当地的Laravel App上从远程服务器缓存图像的最佳解决方案是什么。

请注意,从远程服务器复制/覆盖整个图像目录几乎不可能,因为有超过150k的图像被定期更新(每分钟)并且存在数据库相关性也是(数据库中包含列值的文件名)。

我准备使用Rsync同步两个目录(远离本地),但我还需要在显示图像之前调整图像大小,并以不同于远程服务器的方式组织图像子目录

首先,我在Laravel上安装了Intervention Image Class包,并创建了Route

Route::get('photos/item/{size}/{reference}/{photo}', 'ImgController@showImg');

ImgController

public function showImg( $size, $reference, $photo )
{
    switch ( $size ) {
       case '300x225':
          $jpg = Image::make( 'http://myremoteapp.com/uploads/' . $reference . '/' . $photo )->resize( 300, 225 )->response( 'jpg' );
       break;
    }
    return $jpg;
}

这样做但它不会将图像保留在浏览器的缓存中,并且还会产生性能问题,因为每次打开页面时都必须下载图像并调整其大小。

我听说过Intervention Image Cache,但我不确定它是否适用于从网址中获取的图片。

非常感谢任何有关如何以正确方式解决此问题的建议和意见。

1 个答案:

答案 0 :(得分:3)

您可以将缓存路由用作:

Route::filter('cache', function($route, $request, $response = null) {
    $key = 'route-' . safe_title(URL::full());
    if( is_null($response) && Cache::has($key) ) {
        return Cache::get($key);
    } elseif( !is_null($response) && !Cache::has($key) ) {
        // Code this here
        Cache::put($key, $response->getContent(), 30);
    }
});

    Route::group(array( 'before' => 'cache', 'after' => 'cache' ), function() {
    Route::get('photos/item/{size}/{reference}/{photo}', 'ImgController@showImg');
}