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

原因 
google发现imagemagick的资源管理](Cache Storage and Resource Requirements章节):http://www.imagemagick.org/script/architecture.php

引用

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");

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

imagemagick /tmp/magick-xxxxxxxx相关推荐

  1. 【c++开发】C++ Linux Ubuntu imagemagick以及magick++安装;c++调用magick++库;找不到Magick++.h

    ubuntu系统自带的imagemagick没有c++函数库,需要能重新下载一个新一点的库,重新编译并且安装 一.教程 官网详细教程:https://imagemagick.org/script/in ...

  2. java imagemagick 接口_ImageMagick安装及使用教程

    ImageMagick是一套功能强大且免费的图片处理开发包,可以用来读,写和处理多种格式的图片文件. 本节介绍下ImageMagick的安装与使用方法. 1.imagemagick安装 以linux下 ...

  3. Linux - ImageMagick 6.9.10-5安装配置

    ==-------------------------------------------------------------------------------------------------- ...

  4. linux下安装php的imagick扩展模块(附php升级脚本)

    imagick是一个PHP的扩展,是一套软件系列,用ImageMagick提供的API来进行图片的创建与修改,不过这些操作已经包装到扩展imagick中去了,最终调用的是ImageMagick提供的A ...

  5. DoS Deflate Iptables

    DoS Deflate 是一个轻量级阻止拒绝服务***的bash shell脚本.我们可以根据自己需要修改特定参数,来达到目的! 安装/卸载都很简单,分别执行下面三步就可以了: wget http:/ ...

  6. 使用macOS自带convert,sips命令快速处理图片及转换图片格式

    写在前面 最近有需求转换图片的格式, 例如 将.PDF转换为.png以便CSDN编辑器上传(如果直接使用截图会显得比较麻烦,多费一道手续), 或是将微信的一些图片制作成表情包(需要转换图片为.gif格 ...

  7. 您如何合并两个Git存储库?

    请考虑以下情形: 我在自己的Git存储库中开发了一个小型实验项目A. 它现在已经成熟,我希望A成为较大项目B的一部分,该项目B具有自己的大型存储库. 我现在想将A添加为B的子目录. 如何将A合并为B, ...

  8. 超级NB的防DDOS(小量级)攻击的脚本

    # tree /usr/local/ddos/ /usr/local/ddos/ ├── ddos.conf ├── ddos.sh ├── ignore.ip.list └── LICENSE0 d ...

  9. ZXing vs ZBar: 开源条形码SDK性能PK

    很多手机app条形码应用都使用了ZXing和ZBar两个开源条形码SDK.那么从检测速度和检测率看哪个更出色呢?ZXing用Java实现,ZBar用C/C++实现,为了确保公平,这里用JNI封装ZBa ...

  10. 关于解决VS2008ODBC连接MySQL时“绑定所有列“程序崩溃问题

    2012年5月20更新: 1. 连Oracle没有这个问题,修改了标题 2.可以使用VC6生成这些东西,不过和VS2008生成的有一些不同. ============== 这两天做数据库实验,VS20 ...

最新文章

  1. 对话云知声李霄寒:不计成本研发芯片,探索语音之外的“硬”实力
  2. 面试官:关于Spring就问这13个
  3. 【Android 应用开发】Android 图表绘制 achartengine 示例解析
  4. 分布式经典书籍--深入分布式缓存 从原理到实践
  5. SpringMVC入门案例
  6. 被围绕的区域(dfs)
  7. Python Django 模板继承(header,body,footer抽取)
  8. 怎么查看python是多少位_python+位数
  9. HDOJ 1056 HangOver
  10. 如何让ios app支持32位和64位?
  11. yum只下载软件不安装的两种方法
  12. .view-content:overflow:hidden 大错误
  13. Java HashSet的元素内容变化导致的问题
  14. PMON分析(1)- ROM阶段
  15. 浅析企业供应链管理和供应链战略
  16. 长方形图片填充为正方形
  17. Git查看本地配置信息
  18. Typescript的优缺点和面试题
  19. linux文件名补全,Linux中10个关于命令行自动补全的技巧
  20. mfc chartctrl 饼状图编写_南瓜糯米饼:外酥里糯,吃到嘴巴里,真是舌尖上的享受...

热门文章

  1. Springboot集成Swagger接口测试工具
  2. 全志A64 Android6.0编译
  3. photoshop(ps)基础入门知识 认识图层
  4. 网络高清视频远程会议系统EasyRTC在Windows10上运行程序无返回信息问题解决
  5. 32位联想台式机更新xp到win10工作站版本
  6. 贴片钽电容耐压不符会导致爆炸
  7. postman中的header入参
  8. 腾讯云学生服务器购买教程(图文)
  9. python核密度图_python做密度图
  10. 加密WebSphere Application Server系统密码