Laravel Image Cache比源慢

时间:2015-03-31 08:07:47

标签: php laravel-4 laravel-routing image-caching

我正在使用Intervention / imagecache来缓存我的图像。 但是,缓存图像的加载速度比源图像文件慢。 几乎额外的60-70毫秒的时间性(在铬检查元件网络中测试)

这是我在Route.php上加载图片的代码

    Route::get('images/cars/{src}', function ($src){    
        $cacheimage = Image::cache(function($image) use($src){
            return $image->make("images/products/".$src);
        },1440);

        return Response::make($cacheimage,200, array('Content-Type'=>'image/jpg'));
    });

在刀片中

<img src="{{ URL::asset('/images/cars/theimage.jpg' }}" alt="">

存储图像缓存的任何想法或更好的方法?

2 个答案:

答案 0 :(得分:7)

我从未使用过laravel,但这是一个普遍的问题。

如果您让网络服务器处理将图像传送到客户端,则不会启动PHP解释器。

如果你通过PHP提供一些东西(我假设,因为你写了一些关于缓存图像的东西),你需要PHP解释器。然后你需要执行脚本,并且它的所有逻辑(脚本语言总是较慢,然后是原生的。)

最好的办法是,将图像保存在文件系统上,然后链接到它,而不是PHP脚本。

这意味着例如:

在应用程序的某个位置,您有一个点,即创建原始图像的位置。现在想一想,你需要什么版本的它。调整大小,裁剪,编辑它你想要的。在文件系统中保存所需的每个版本。所以你有image.jpg而不是image-200x200-cropped-with-branding.jpg。在这一点上,性能不应该那么重要(图像将被观看数千次,但只创建一次)。

你想拥有

<img src="/path/to/image-200x200-cropped-with-branding.jpg">;

而不是

<img src="/image.php?param1=1&param2=2">;

答案 1 :(得分:2)

根据Christian Gollhardt的回答,还有一些额外的想法。

他是绝对正确的,这是一个普遍的问题。但我不喜欢他创建原始图像的创建(或上传)所需的所有版本的方法。因为有一个大问题,如果 - 在某个时候未来 - 你决定你的缩略图应该是250x250而不是200x200(或任何其他尺寸)?基本上我想要的是ImageCache包提供的灵活性,而不会降低性能。

我还没有真正实现这一点,但我的方法是使用某种 - 在 - 帮助函数之间 - 在你的视图中包含所有图像。本质上,辅助函数将模拟图像缓存的功能,但不是在实际图像请求上处理所有逻辑,而是在页面请求期间处理它。因此,当从用户浏览器请求实际图像时,已经在服务器上创建了每个图像版本,并且链接将指向文件系统上的实际图像。一些伪代码更好地解释了......

e.g。在 show_profile.blade 视图中

<h1>{{ $profile->name }}</h1>
<img src="{{ image_helper($profile->image->filename, 'small') }}">

helpers.php

function image_helper($filename, $version) {
    if (!file_exists($version . '_' . $filename)) {
        // some other helper function ...
        create_image_version($filename, $version);
    }

    return "my/images/" . $version . '_' . $filename;
}

function create_image_version($filename, $version) {
    // if you want to go that route, you would need some kind of mapping
    // that maps the $version (string) to a codeblock that actually knows
    // what to do if that version is requested.
    // E.g. if the version 'small' is requested, 
    // create an image with a dimension of 100x100
}