博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
imagemagick /tmp/magick-xxxxxxxx
阅读量:6307 次
发布时间:2019-06-22

本文共 1320 字,大约阅读时间需要 4 分钟。

问题 

imagemagick在某种场景下会狂写/tmp目录,文件名形如magick-xxxxxxxx, 
ls -lh查看这些文件达到几百G, 
du -sh查看则只有几十M 
被这个问题折磨了许久,大晚上收报警、出去玩收报警的感觉你懂的。。。 
忍够了!!! 
原因 
google发现imagemagick的资源管理](Cache Storage and Resource Requirements章节): 

引用
imagemagick内部有个帧缓存(pixel cache),用于提升存储和处理速度,其大小与图片的尺寸、位深正相关。随着图片尺寸的增大,其存储介质会做出相应调整: 
  • 通常情况下,只会在堆内存中处理图片
  • 堆内存不够用时,帧缓存使用anonymous map
  • anonymous map不够用时,使用硬盘作为帧缓存,并硬盘映射到内存中
  • 内存映射所需内存仍不够用时,只能使用磁盘作为缓存,其性能严重依赖磁盘IO性能

至于使用哪个缓存介质是由Imagemagick依据所配置的资源限制参数来自动决定的,我们可以修改这些参数,但修改这几个参数都只是缓解症状,无法避免图片较大时还是要写硬盘。 
解决方案 
阅读代码发现可以通过三种方式修改临时文件存放目录: 

  • 注册表
Shell代码  
  1. convert -define registry:temporary-path=/data/tmp logo:  -resize 250000x250000 logo.miff  
  • 环境变量
  • policy.xml

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

C代码  
    1. //magick/resource.c  
    2. (void) CopyMagickString(path,"magick-XXXXXXXX",MaxTextExtent);  
    3. exception=AcquireExceptionInfo();  
    4. directory=(char *) GetImageRegistry(StringRegistryType,"temporary-path",  
    5.   exception);  
    6. exception=DestroyExceptionInfo(exception);  
    7. if (directory == (char *) NULL)  
    8.   directory=GetEnvironmentValue("MAGICK_TEMPORARY_PATH");  
    9. printf("tmp path:%s\n",directory);  
    10. if (directory == (char *) NULL)  
    11.   directory=GetEnvironmentValue("MAGICK_TMPDIR");  
    12. if (directory == (char *) NULL)  
    13.   directory=GetPolicyValue("temporary-path");  

本文转自博客园知识天地的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
英语学习的重要性
查看>>
Android中Handler引起的内存泄露
查看>>
原产地政策,jsonp跨域
查看>>
HDU 1143 Tri Tiling(递归)
查看>>
ffmpeg参数具体解释
查看>>
记一次公司仓库数据库服务器死锁过程
查看>>
Oracle 11g password过期被锁定报道 ORA-28000 the account is locked
查看>>
【Struts2学习笔记(2)】Action默认值和配置Action于result各种转发类型
查看>>
轨磁条简介
查看>>
(算法)交错的字符串
查看>>
hdu 5471(状压DP or 容斥)
查看>>
oracle.jdbc.driver.OracleDriver和oracle.jdbc.OracleDriver这两个驱动的区别
查看>>
NSQ部署
查看>>
git常用命令记录
查看>>
IBM发布新一代云计算工具包MobileFirst Foundation
查看>>
唯品会HDFS性能挑战和优化实践
查看>>
大规模学习该如何权衡得失?解读NeurIPS 2018时间检验奖获奖论文
查看>>
大厂前端高频面试问题与答案精选
查看>>
我们用5分钟写了一个跨多端项目
查看>>
Visual Studio 15.4发布,新增多平台支持
查看>>