使用ImageMagick时,我可以为内存使用和最大线程数设置一些限制。据我所知,有三种方法可以做到这一点:
我已经使用“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时更改线程限制?
编辑: 通过使用'--without-threads'选项编译ImageMagick,我设法将线程限制设置为1。 :P必须要做,直到找到更好的解决方案。
答案 0 :(得分:5)
这有助于:
Imagick::setResourceLimit (6, 1);
答案 1 :(得分:2)
可以将MAGICK_THREAD_LIMIT环境变量传递给PHP解释器,因此您无需触摸ImageMagick代码。
答案 2 :(得分:1)
在PHP IMagick扩展中没有为线程限制定义相应的常量,但是查看源的整数值应该是6,所以你可以试试(参见magick / resource_.h中的ResourceType,所需的值是ThreadResource )。我使用MagickWand for PHP并遇到了同样的问题 - 修复是为了启用此常量并重新编译。如果您有兴趣修补MagickWand for 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 );
答案 3 :(得分: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