2

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

  1. 使用命令行选项,例如“convert -limit memory 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 时如何更改线程限制?

编辑:通过使用“--without-threads”选项编译 ImageMagick,我设法将线程限制设置为 1。:P 在我找到更好的解决方案之前必须这样做。

4

4 回答 4

5

这有助于:

Imagick::setResourceLimit (6, 1);
于 2013-02-05T22:08:17.943 回答
2

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

看看这个:使用 ImageMagick 转换图像时 CPU 负载高

于 2012-03-13T15:30:43.190 回答
1

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

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 );
于 2010-07-13T06:24:49.673 回答
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
于 2014-01-16T12:44:34.007 回答