【发布时间】:2010-01-22 22:58:03
【问题描述】:
使用 ImageMagick 时,我可以对内存使用和最大线程数设置一定的限制。据我所知,有3种方法可以做到这一点:
- 使用命令行选项,例如“convert -limit memory 128mb original.jpg new.jpg”
- 使用“MAGICK_THREAD_LIMIT=1”等环境变量
- 编辑“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 在我找到更好的解决方案之前必须这样做。
【问题讨论】:
-
您是否也尝试使用一个小的非零值作为内存限制? (例如,1)似乎没有关于 setResourceLimit 方法的任何文档,它可能使用 0 作为无限制,或者可以忽略 0 并在调用 imagemagick 时使用默认值。
-
如果我使用 $image->setResourceLimit 将限制设置为零,IMagick 会给我关于内存不足的错误。我很确定这会禁用它们,例如,您可以禁用磁盘内存。
-
我知道设置内存资源限制只是使用了多少 RAM -- 如果需要更多,它将使用自己的基于磁盘的交换文件来处理其余部分。
标签: php imagemagick imagick