限制 IMagick (PHP) 中的线程数

发布于 2024-08-19 02:14:12 字数 1084 浏览 6 评论 0原文

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

  1. 使用命令行选项,如“convert -limit memory 128mb original.jpg new.jpg”
  2. 使用环境变量,如“MAGICK_THREAD_LIMIT=1”
  3. 编辑“policy.xml”配置文件来更改默认值。

我已经使用“convert -list resources”测试了这些方法,并且它们有效。

现在,我需要在 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 直到我找到更好的解决方案为止。

When using ImageMagick, I can set certain limits for memory usage and maximum number of threads. There are 3 ways to do this, as far as I know:

  1. use a command line options like "convert -limit memory 128mb original.jpg new.jpg"
  2. use environment variables like "MAGICK_THREAD_LIMIT=1"
  3. edit the 'policy.xml' configuration file to change the default value.

I have tested each of these methods using "convert -list resource" and they work.

Now, I need to use the IMagick extension in PHP. There is a function I can use to set limits:

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

For the first parameter I can use one of the following:

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

The problem is that there is no equivalent for MAGICK_THREAD_LIMIT and IMagick seems to simply ignore the configuration files and the environment variables. How do I know this? I've set all the memory limits to zero and IMagick still functions without any problem when it should report insufficient memory.

I really hope I have made myself clear.
The question is: how can I change the thread limit when using IMagick?

EDIT:
I've managed to set the thread limit to 1 by compiling ImageMagick with the '--without-threads' option. :P It will have to do until I find a better solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

天赋异禀 2024-08-26 02:14:13

这有助于:

Imagick::setResourceLimit (6, 1);

This helped:

Imagick::setResourceLimit (6, 1);
_失温 2024-08-26 02:14:13

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

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

It is possible to pass the MAGICK_THREAD_LIMIT environment variable to PHP interpreter so you don't need to touch the ImageMagick code.

Check this out: High CPU load when converting images with ImageMagick

话少情深 2024-08-26 02:14:13

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 );

There is no corresponding constant defined for the thread limit in the PHP IMagick extension, but looking at the source the integer value should be 6 so you could try that (see ResourceType in magick/resource_.h, the needed value is ThreadResource). Am using MagickWand for PHP and had the same issue--fix was to enable this constant and recompile. If you are interested in patching MagickWand for PHP 1.0.8 the fix is:

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 );
绿萝 2024-08-26 02:14:13

在 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

At ImageMagick version 6.8.7-4, setResourceLimit(6,1) doesn't help, neither
MAGICK_THREAD_LIMIT=1.

But this setting does the trick:

OMP_THREAD_LIMIT=1

In CLI:

env OMP_THREAD_LIMIT=1 php ./myscript.php
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文