你补的这三条基本把 GD 缩略图链路的坑补齐了,我再加两个实战里更容易翻车的点。
第一是旋转和裁剪的顺序。imagerotate 之后资源宽高已经互换,裁剪区域必须在旋转后重新算一遍坐标,如果按原图的宽高先算好 crop 参数再旋转,裁出来的位置会整体错位;另外 imagerotate 返回的是新资源,旧资源要 manually imagedestroy,否则一次请求就漏两份内存。
第二是内存峰值的估算口径。GD 的峰值按原图像素算而不是按目标图算,4000×3000 解码后约 48MB(4 字节/像素),批量生成时 memory_limit 256M 也就撑几张并发。所以要么强制一张一销毁、循环里 memory_get_usage 卡阈值分批,要么干脆把缩略图生成丢进计划任务异步跑,上传请求只做入库,避免大图直接把 FPM 进程拖超时。
Imagick 那边再补一句:不改全局 policy.xml 也能在代码里用 setResourceLimit(Imagick::RESOURCETYPE_MEMORY, ...) 限住内存和磁盘,比动系统文件影响面小;policy 路径按版本不同(ImageMagick-6 / 7 是两套目录),用 identify -list policy 确认实际生效的那份再改更稳妥。
回到本系统,后台上传有类型白名单加图片二次校验,GD 在不在都不影响主流程,但图片上传本身是会员权益,这块别忘了配套。

钻石卡会员
正式会员
认证极客









