laravel 通过 intervention-image 实现基于url的图像调整大小+缓存的操作

在通过url调用图片时候 自动生成相应大小的缩率图并缓存,很好用,但除了官方文档写的,还可能需要调整php/nginx 的图片缓存,有点冲突

Posted by 昆山吴彦祖 on 2018.07.04

intervention-image 拓展程序很棒的一个功能,基于url的图像调整大小+缓存的操作,简直神器。 


安装

composer require intervention/image
composer require intervention/imagecache


生成配置文件

php artisan vendor:publish

会生成一个配置文件 /config/imagecache.php


修改配置文件

'route' => 'imagecache',

#自定义配置路由前缀,配置完成后通过 /{route}/{template}/{file} (file可以是路径:images/1.jpg 这种,只需要在path的路径中能找到)

'paths' => array(
  public_path('uploads'), 
  ...
),

#可以多个path,会遍历去检索,但是只会返回找到的第一个文件,所以要注意重名问题


模板

系统自带3个缩略图模板

  • small - 120x90 
  •  medium - 240x180 
  •  large - 480x360

如果需要可以在 配置文件中新增自定义模板


使用

比如要访问 /uploads/images/1.jpg 的最小的缩略图(route前缀定义为 imagecache;path定义的文件夹为 uploads的情况下)

<img src="/imagecache/small/images/1.jpg"/>

访问后会基于laravel的cache系统在  /storage/framework/cache/ 中生成图片缓存文件,有效期 配置文件中可改


可能出现的问题

1、笔者做到最后一步,访问图片却报404错误,nginx的,不是laravel的。

把网站配置文件中下面部分注释掉即可,这样图片文件就会走laravel的路由 ,不然会直接走文件路径访问,所以报404

 OR  /imagecache/small/images/1.jpg/ 这样去引用图片

# location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
# {
# error_log off;
# access_log /dev/null;
# }


2、性能问题

laravel是一个重型框架,每次执行request请求需要载入大量文件(IO请求),加上php每次执行请求都要 重新载入资源、解释php、执行、释放资源;

所以可能造成用这种laravel内执行图片缓存请求处理造成服务器性能压力(1次请求会附带多次额外请求)和 响应时长较长,整体性能还不如直接请求相对较大的图片(将性能压力、请求时间转移到带宽)

OR 开启opcache /swoole插件 来解决请求资源消耗/时长 问题

intervention-image