imagemagick /tmp/magick-xxxxxxxx

[size=large][b]问题[/b][/size]
imagemagick在某种场景下会狂写/tmp目录,文件名形如magick-xxxxxxxx,
ls -lh查看这些文件达到几百G,
du -sh查看则只有几十M
被这个问题折磨了许久,大晚上收报警、出去玩收报警的感觉你懂的。。。
[color=red]忍够了!!![/color]

[size=large][b]原因[/b][/size]
google发现imagemagick的资源管理](Cache Storage and Resource Requirements章节):[url]http://www.imagemagick.org/script/architecture.php[/url]
[quote]
imagemagick内部有个帧缓存(pixel cache),用于提升存储和处理速度,其大小与图片的尺寸、位深正相关。随着图片尺寸的增大,其存储介质会做出相应调整:
[list]
[*] 通常情况下,只会在堆内存中处理图片
[*] 堆内存不够用时,帧缓存使用anonymous map
[*] anonymous map不够用时,使用硬盘作为帧缓存,并硬盘映射到内存中
[*] 内存映射所需内存仍不够用时,只能使用磁盘作为缓存,其性能严重依赖磁盘IO性能
[/list]
[/quote]
至于使用哪个缓存介质是由Imagemagick依据所配置的资源限制参数来自动决定的,我们可以修改这些参数,但修改这几个参数都只是缓解症状,无法避免图片较大时还是要写硬盘。

[size=large][b]解决方案[/b][/size]
阅读代码发现可以通过三种方式修改临时文件存放目录:

[*] 注册表
convert -define registry:temporary-path=/data/tmp logo:  -resize 250000x250000 logo.miff

[*] 环境变量
[*] policy.xml

[color=blue]遗憾的是,基于php imagick扩展无法修改帧缓存目录,三种方案均依赖于系统环境配置。好在我们的php框架可以方便的设定环境变量,算是巧妙地将所依赖的环境控制在项目范围内[/color]
PS:
imagemagick选择帧缓存目录相关源码:

//magick/resource.c
(void) CopyMagickString(path,"magick-XXXXXXXX",MaxTextExtent);
exception=AcquireExceptionInfo();
directory=(char *) GetImageRegistry(StringRegistryType,"temporary-path",
exception);
exception=DestroyExceptionInfo(exception);
if (directory == (char *) NULL)
directory=GetEnvironmentValue("MAGICK_TEMPORARY_PATH");
printf("tmp path:%s\n",directory);
if (directory == (char *) NULL)
directory=GetEnvironmentValue("MAGICK_TMPDIR");
if (directory == (char *) NULL)
directory=GetPolicyValue("temporary-path");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值