imagemagick /tmp/magick-xxxxxxxx

简介:

问题 
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,如需转载请自行联系原博主。

相关文章
|
分布式计算 Hadoop Linux
Linux报错:mkdir:无法创建目录“/opt/apps/xxx/logs“: Permission denied
Linux报错:mkdir:无法创建目录“/opt/apps/xxx/logs“: Permission denied
480 0
|
12月前
|
Apache
系统找不到指定的路径。 : AH02291: Cannot access directory ‘D:/xp.cn/www/wwwroot/admin/PhpTest_10006/log/‘ for e
系统找不到指定的路径。 : AH02291: Cannot access directory ‘D:/xp.cn/www/wwwroot/admin/PhpTest_10006/log/‘ for e
93 0
|
缓存 PHP
Composer报错: Failed to execute (9) unzip -qq -o “D:\Code/vendor/composer/tmp-d44ec330d383e320b9a78bfc
Composer报错: Failed to execute (9) unzip -qq -o “D:\Code/vendor/composer/tmp-d44ec330d383e320b9a78bfc
210 0
Composer报错: Failed to execute (9) unzip -qq -o “D:\Code/vendor/composer/tmp-d44ec330d383e320b9a78bfc
|
存储 缓存 关系型数据库
Linux目录和文件管理:pwd、cd、ls、alias、du(上)
目录和文件管理 由于 Linux 系统免费开源,使得 Linux 发行版本有很多,利用 Linux 开发产品的团队也有很多,如果任由每个人都按照自己的想法来配置 Linux 系统文件目录,后期可能会产生诸多的管理问题。试想,如果你进入一家公司,所用 Linux 系统的文件目录结构与所学的完全不同,实在令人头疼。 为了避免诸多使用者对 Linux 系统目录结构天马行空,Linux 基金会发布了 FHS 标准。多数 Linux 发行版系统都遵循这一标准。
240 0
Can‘t exec “aclocal“: 没有那个文件或目录 at /usr/share/autoconf/Autom4te/FileUtils.pm line 326.
Can‘t exec “aclocal“: 没有那个文件或目录 at /usr/share/autoconf/Autom4te/FileUtils.pm line 326.
335 0
Can‘t exec “autopoint“: 没有那个文件或目录 at /usr/share/autoconf/Autom4te/FileUtils.pm line 345.
Can‘t exec “autopoint“: 没有那个文件或目录 at /usr/share/autoconf/Autom4te/FileUtils.pm line 345.
468 0
|
网络安全 开发工具 git
错误解决办法:exec /usr/lib/ssh/ssh-askpass : No such file or directory error.
错误解决办法:exec /usr/lib/ssh/ssh-askpass : No such file or directory error.
286 0
|
Linux
Linux目录和文件管理:pwd、cd、ls、alias、du(中)
目录和文件管理 由于 Linux 系统免费开源,使得 Linux 发行版本有很多,利用 Linux 开发产品的团队也有很多,如果任由每个人都按照自己的想法来配置 Linux 系统文件目录,后期可能会产生诸多的管理问题。试想,如果你进入一家公司,所用 Linux 系统的文件目录结构与所学的完全不同,实在令人头疼。 为了避免诸多使用者对 Linux 系统目录结构天马行空,Linux 基金会发布了 FHS 标准。多数 Linux 发行版系统都遵循这一标准。
295 0
|
Linux
Linux目录和文件管理:pwd、cd、ls、alias、du(下)
目录和文件管理 由于 Linux 系统免费开源,使得 Linux 发行版本有很多,利用 Linux 开发产品的团队也有很多,如果任由每个人都按照自己的想法来配置 Linux 系统文件目录,后期可能会产生诸多的管理问题。试想,如果你进入一家公司,所用 Linux 系统的文件目录结构与所学的完全不同,实在令人头疼。 为了避免诸多使用者对 Linux 系统目录结构天马行空,Linux 基金会发布了 FHS 标准。多数 Linux 发行版系统都遵循这一标准。
153 0
CentOS cp 复制隐藏文件提示 cp: cannot stat ?.xxx*?. No such file or directory
执行的命令与错误信息: # cp -a /etc/skel/* /home/postgrescp: cannot stat ?.etc/skel/*?. No such file or directory 使用cp复制普通文件时,可以使用 * 号通配符,而在复制隐藏文件时,需要使用.
4627 0