2010-01-22 47 views
2

使用ImageMagick时,我可以设置内存使用量和最大线程数的某些限制。有3种方法可以做到这一点,据我所知:IMagick(PHP)中的线程数限制

  1. 使用命令行选项,如“转换-limit 128MB内存original.jpg new.jpg”
  2. 使用环境变量,如“MAGICK_THREAD_LIMIT = 1 “
  3. 编辑'policy.xml'配置文件以更改默认值。

我已经使用“convert -list resource”测试了这些方法中的每一个,它们都可以工作。

现在,我需要在PHP中使用IMagick扩展。还有一个功能,我可以用它来设置限制:

bool Imagick::setResourceLimit (int $type, int $limit) 

对于第一个参数,我可以使用下列之一:

imagick::RESOURCETYPE_AREA (integer) //equivalent of MAGICK_AREA_LIMIT 
imagick::RESOURCETYPE_DISK (integer) //equivalent of MAGICK_DISK_LIMIT 
imagick::RESOURCETYPE_FILE (integer) //equivalent of MAGICK_FILE_LIMIT 
imagick::RESOURCETYPE_MAP (integer) //equivalent of MAGICK_MAP_LIMIT 
imagick::RESOURCETYPE_MEMORY (integer) //equivalent of MAGICK_MEMORY_LIMIT 

的问题是,有没有类似MAGICK_THREAD_LIMIT和IMagick似乎简单地忽略配置文件和环境变量。我怎么知道这个?我已将所有内存限制设置为零,并且IMagick在报告内存不足时仍能正常运行。

我真的很希望我已经说清楚了。 问题是:如何在使用IMagick时更改线程限制?

编辑: 我设法将线程限制设置为1通过编译ImageMagick与'--without-threads'选项。 :P它将不得不做,直到我找到一个更好的解决方案。

+0

你尝试使用一个小的,非零值的内存限制,以及? (例如。,1)似乎没有关于setResourceLimit方法的任何文档,它可以使用0作为无限制,或者0可以被忽略,并且当imagemagick被调用时使用默认值。 – gapple 2010-01-23 01:27:00

+0

如果我使用$ image-> setResourceLimit将限制设置为零,IMagick会给我提供关于内存不足的错误。我很确定这会禁用它们,例如,您可以禁用磁盘内存。 – liviucmg 2010-01-23 07:10:05

+0

据我所知,设置内存资源限制只是使用了多少内存 - 如果需要更多内存,它将使用其自己的基于磁盘的交换文件。 – scotts 2010-12-10 21:57:01

回答

1

在PHP IMagick扩展中没有为线程限制定义相应的常量,但查看整数值应该是6的源代码,以便您可以尝试此操作(请参阅magick/resource_.h中的ResourceType,所需值为ThreadResource)。我正在使用MagickWand for PHP,并且遇到了同样的问题 - 解决方法是启用此常量并重新编译。如果你有兴趣在修补MagickWand为PHP 1.0.8修复是:

magickwand_inc.h 
-#define PRV_IS_ResourceType(x) (x == AreaResource || x == DiskResource || x == FileResource || x == MapResource || x == MemoryResource) /* || x == UndefinedResource */ 
+#define PRV_IS_ResourceType(x) (x == AreaResource || x == DiskResource || x == FileResource || x == MapResource || x == MemoryResource || x == ThreadResource) /* || x == UndefinedResource */ 

magickwand.c 
    MW_REGISTER_LONG_CONSTANT(MemoryResource); 
+ MW_REGISTER_LONG_CONSTANT(ThreadResource); 
+0

谢谢!现在我正在使用ImageMagick编译'--without-threads'标志,它也做了这个。我不知道为什么,但如果编译为使用线程,ImageMagick在我的VPS上运行速度会降低2-3倍。 – liviucmg 2010-07-14 07:40:23

5

这帮助:

Imagick::setResourceLimit (6, 1); 
1

在ImageMagick的版本6.8.7-4,setResourceLimit(6,1)没有帮助,也不 MAGICK_THREAD_LIMIT = 1。

但此设置的伎俩:

OMP_THREAD_LIMIT=1 

在CLI:

env OMP_THREAD_LIMIT=1 php ./myscript.php