Yii2中不应用Gzip压缩图片,因其对JPEG/PNG等二进制格式无效;应通过GD/Imagick上传时有损压缩(质量80~85)、Nginx image_filter预处理或<picture>提供WebP降级,避免实时PHP压缩。

Yii2 中启用 Gzip 响应压缩不处理图片
gzip 是 HTTP 层的文本压缩,对已编码的 .jpg、.png 这类二进制图片文件基本无效,强行 gzip 反而可能增大体积。所以「用 gzip 压缩图片」本身是个误解——你真正需要的是在生成或传输前降低图片质量、尺寸或格式。
在 Yii2 控制器里用 PHP 压缩 JPEG/PNG(GD 或 Imagick)
常见做法是在上传后、保存前做一次有损压缩。GD 扩展更轻量,Imagick 支持更多格式和精细控制,但需额外安装。
- GD 默认支持
imagejpeg()的质量参数(0–100),推荐设为80~85:视觉损失小,体积下降明显 - 务必先调用
imagecreatetruecolor()+imagecopyresampled()缩放,再压缩;否则只改质量不缩尺寸,意义有限 - 注意 GD 不支持 WebP,Imagick 支持但需确认
imagick.format配置允许输出 - 别在响应中实时压缩大图(比如用户直接访问
/images/xxx.jpg),会阻塞 PHP 进程;应预生成并缓存压缩后版本
imagejpeg($img, $dstPath, 82);
用 Nginx / Apache 替代 PHP 做图片响应优化
把压缩逻辑从 PHP 移到 Web 服务器层,更高效也更可控。Yii 只管业务,静态资源交给 Nginx 处理。
- Nginx 需启用
ngx_http_image_filter_module(编译时加--with-http_image_filter_module) - 用
image_filter resize 800 -或image_filter quality 85直接在 URL 上控制尺寸和质量 - 注意该模块只支持 JPEG/PNG/GIF,不支持 WebP;且原始图必须可读,路径要映射正确(常踩坑点:
image_filter对相对路径敏感,建议用绝对路径或alias明确指定) - Apache 用户可用
mod_rewrite+mod_pagespeed,但后者配置复杂、兼容性差,不如 Nginx 方案直接
前端配合:用 <picture> 和现代格式降级
服务端压缩只是半程,客户端加载策略决定最终体验。Yii 输出 HTML 时,应主动提供多格式选项。
- 优先输出
webp(体积比 JPEG 小 25%~35%),用<source srcset="a.webp" type="image/webp">供支持浏览器使用 -
<img src="a.jpg">作为 fallback,确保老浏览器仍能显示 - 别依赖 PHP 自动转 WebP:检测
Accept请求头容易出错,且 CDN 缓存会混乱;用<picture>让浏览器自己选最合适的 - 记得给所有
<img>加width/height属性,避免 CLS(布局偏移)










