限制 IMagick (PHP) 中的线程数
使用 ImageMagick 时,我可以对内存使用和最大线程数设置一定的限制。据我所知,有 3 种方法可以做到这一点:
- 使用命令行选项,如“convert -limit memory 128mb original.jpg new.jpg”
- 使用环境变量,如“MAGICK_THREAD_LIMIT=1”
- 编辑“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:
- use a command line options like "convert -limit memory 128mb original.jpg new.jpg"
- use environment variables like "MAGICK_THREAD_LIMIT=1"
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这有助于:
This helped:
可以将 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
PHP IMagick 扩展中没有为线程限制定义相应的常量,但是查看源代码,整数值应该是 6,因此您可以尝试一下(请参阅 magick/resource_.h 中的 ResourceType,所需的值为 ThreadResource)。我在 PHP 中使用 MagickWand 并遇到了同样的问题 - 修复方法是启用此常量并重新编译。如果您有兴趣为 PHP 1.0.8 修补 MagickWand,修复方法是:
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:
在 ImageMagick 版本 6.8.7-4 中,setResourceLimit(6,1) 没有帮助,也没有
MAGICK_THREAD_LIMIT=1。
但这个设置可以解决问题:
在 CLI 中:
At ImageMagick version 6.8.7-4, setResourceLimit(6,1) doesn't help, neither
MAGICK_THREAD_LIMIT=1.
But this setting does the trick:
In CLI: