我正在使用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="">
存储图像缓存的任何想法或更好的方法?
答案 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¶m2=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
}