记录一下对于低配小鸡装了Piwigo使用imagick进行缩略图生成后内存占用较大问题处理


事发经过

先前在一台1G1H的服务器上安装了Piwigo,使用了Imagick进行缩略图的生成
当照片数量越来越多缩略图缓存占用也越来越多,不想让缓存占用太多就要配置cron定期删除一些很长时间没有访问过的缩略图文件,当后续再次访问这些被清理的照片的缓存时就要重新生成
此时请求较多的高分辨率照片生成缩略图就可能导致服务器内存瞬间爆满直接卡爆,所以现在需要限制一下Imagick对内存的使用,防止内存被用完导致服务器进程被OOM

可以调整下方的piwigo文件去限制Imagick的内存使用,当Imagick超过限制时,生成缩略图过程中的临时文件将会临时被写入硬盘
所以还需确保硬盘空间足够,以及不要限制得过于太小,防止硬盘大量IO等待影响性能


文件修改

在Piwigo目录中找到./piwigo/admin/include/image.class.php以及./piwigo/tools/metadata.php文件
在这两个文件中<?php后面换行加入以下内容:

Imagick::setResourceLimit(imagick::RESOURCETYPE_MAP, 268435456)  #设置为像素缓存分配的内存映射的最大字节数256MB
Imagick::setResourceLimit(imagick::RESOURCETYPE_MEMORY, 268435456)  #设置从堆中为像素缓存分配的最大内存量256MB
Imagick::setResourceLimit(imagick::RESOURCETYPE_DISK, 1073741824)  #设置允许像素缓存使用的最大磁盘空间量1GB

可根据需要调整其中限制的数值,这三条限制后面的值都是以字节为单位。
对于硬盘较大不需要限制硬盘占用的可以不使用第三条。


注意事项

  • 不要将内存限制得过于太小,以免过多使用硬盘造成IO拥堵服务器运行缓慢
  • 如果调整后生成时间很长,注意调整php、前端HTTP服务器的超时时间,防止超时失败
  • 非常大的图片在使用Imagick处理时仍可能会超越上述设置的限制造成服务器卡死,上传时可能仍需对分辨率特别大的图片手动处理
Last modification:April 25, 2025
如果喜欢,打赏几分钱呗:)