限制IMagick中的线程数(PHP)

时间:2010-01-22 22:58:04

标签: php imagemagick imagick

使用ImageMagick时,我可以为内存使用和最大线程数设置一些限制。据我所知,有三种方法可以做到这一点:

  1. 使用命令行选项,例如“convert -limit memory 128mb original.jpg new.jpg”
  2. 使用“MAGICK_THREAD_LIMIT = 1”等环境变量
  3. 编辑'policy.xml'配置文件以更改默认值。
  4. 我已经使用“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必须要做,直到找到更好的解决方案。

4 个答案:

答案 0 :(得分:5)

这有助于:

Imagick::setResourceLimit (6, 1);

答案 1 :(得分:2)

可以将MAGICK_THREAD_LIMIT环境变量传递给PHP解释器,因此您无需触摸ImageMagick代码。

检查出来:High CPU load when converting images with 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